PassFactory.cpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzCore/Interface/Interface.h>
  9. #include <Atom/RPI.Public/Pass/ComputePass.h>
  10. #include <Atom/RPI.Public/Pass/CopyPass.h>
  11. #include <Atom/RPI.Public/Pass/FullscreenTrianglePass.h>
  12. #include <Atom/RPI.Public/Pass/ParentPass.h>
  13. #include <Atom/RPI.Public/Pass/PassLibrary.h>
  14. #include <Atom/RPI.Public/Pass/Specific/DownsampleMipChainPass.h>
  15. #include <Atom/RPI.Public/Pass/Specific/DownsampleSinglePassLuminancePass.h>
  16. #include <Atom/RPI.Public/Pass/Pass.h>
  17. #include <Atom/RPI.Public/Pass/PassFactory.h>
  18. #include <Atom/RPI.Public/Pass/PassFilter.h>
  19. #include <Atom/RPI.Public/Pass/RasterPass.h>
  20. #include <Atom/RPI.Public/Pass/MSAAResolvePass.h>
  21. #include <Atom/RPI.Public/Pass/SlowClearPass.h>
  22. #include <Atom/RPI.Public/Pass/Specific/MSAAResolveFullScreenPass.h>
  23. #include <Atom/RPI.Public/Pass/Specific/EnvironmentCubeMapPass.h>
  24. #include <Atom/RPI.Public/Pass/Specific/RenderToTexturePass.h>
  25. #include <Atom/RPI.Public/Pass/Specific/SelectorPass.h>
  26. #include <Atom/RPI.Reflect/Pass/PassAsset.h>
  27. #include <Atom/RPI.Reflect/Pass/PassTemplate.h>
  28. namespace AZ
  29. {
  30. namespace RPI
  31. {
  32. void PassFactory::Init(PassLibrary* passLibrary)
  33. {
  34. m_passLibrary = passLibrary;
  35. AddCorePasses();
  36. }
  37. void PassFactory::Shutdown()
  38. {
  39. m_passClassNames.clear();
  40. m_creationFunctions.clear();
  41. }
  42. // --- Entry related functions ---
  43. void PassFactory::AddPassCreator(Name passClassName, PassCreator createFunction)
  44. {
  45. // Ensure we don't already have a PassCreator registered with this Name
  46. AZ_Assert(FindCreatorIndex(passClassName) == CreatorIndex::Null,
  47. "The Pass Factory already has a creator for the class name %s",
  48. passClassName.GetCStr());
  49. m_passClassNames.push_back(passClassName);
  50. m_creationFunctions.push_back(createFunction);
  51. }
  52. void PassFactory::AddCorePasses()
  53. {
  54. AddPassCreator(Name("ParentPass"), &ParentPass::Create);
  55. AddPassCreator(Name("RasterPass"), &RasterPass::Create);
  56. AddPassCreator(Name("SlowClearPass"), &SlowClearPass::Create);
  57. AddPassCreator(Name("CopyPass"), &CopyPass::Create);
  58. AddPassCreator(Name("FullScreenTriangle"), &FullscreenTrianglePass::Create);
  59. AddPassCreator(Name("ComputePass"), &ComputePass::Create);
  60. AddPassCreator(Name("MSAAResolvePass"), &MSAAResolvePass::Create);
  61. AddPassCreator(Name("MSAAResolveFullScreenPass"), &MSAAResolveFullScreenPass::Create);
  62. AddPassCreator(Name("DownsampleMipChainPass"), &DownsampleMipChainPass::Create);
  63. AddPassCreator(Name("DownsampleSinglePassLuminancePass"), &DownsampleSinglePassLuminancePass::Create);
  64. AddPassCreator(Name("EnvironmentCubeMapPass"), &EnvironmentCubeMapPass::Create);
  65. AddPassCreator(Name("RenderToTexturePass"), &RenderToTexturePass::Create);
  66. AddPassCreator(Name("SelectorPass"), &SelectorPass::Create);
  67. }
  68. PassFactory::CreatorIndex PassFactory::FindCreatorIndex(Name passClassName)
  69. {
  70. for (uint32_t i = 0; i < m_passClassNames.size(); ++i)
  71. {
  72. if (passClassName == m_passClassNames[i])
  73. {
  74. return CreatorIndex(i);
  75. }
  76. }
  77. return CreatorIndex::Null;
  78. }
  79. bool PassFactory::HasCreatorForClass(Name passClassName)
  80. {
  81. return FindCreatorIndex(passClassName) != CreatorIndex::Null;
  82. }
  83. // --- Pass Creation Functions ---
  84. Ptr<Pass> PassFactory::CreatePassFromIndex(CreatorIndex index, Name passName, const AZStd::shared_ptr<const PassTemplate>& passTemplate, const PassRequest* passRequest)
  85. {
  86. if (index.IsNull() || index.GetIndex() >= m_creationFunctions.size())
  87. {
  88. AZ_Error("PassFactory", false, "FAILED TO CREATE PASS [%s].", passName.GetCStr());
  89. return nullptr;
  90. }
  91. PassCreator passCreator = m_creationFunctions[index.GetIndex()];
  92. PassDescriptor passDescriptor(passName, passTemplate, passRequest);
  93. Ptr<Pass> pass = passCreator(passDescriptor);
  94. return pass;
  95. }
  96. Ptr<Pass> PassFactory::CreatePassFromClass(Name passClassName, Name passName)
  97. {
  98. CreatorIndex index = FindCreatorIndex(passClassName);
  99. return CreatePassFromIndex(index, passName, nullptr, nullptr);
  100. }
  101. Ptr<Pass> PassFactory::CreatePassFromTemplate(const AZStd::shared_ptr<const PassTemplate>& passTemplate, Name passName)
  102. {
  103. if (!passTemplate)
  104. {
  105. AZ_Assert(false, "PassFactory::CreatePassFromTemplate() was handed a null PassTemplate!");
  106. return nullptr;
  107. }
  108. CreatorIndex index = FindCreatorIndex(passTemplate->m_passClass);
  109. return CreatePassFromIndex(index, passName, passTemplate, nullptr);
  110. }
  111. Ptr<Pass> PassFactory::CreatePassFromTemplate(Name templateName, Name passName)
  112. {
  113. const AZStd::shared_ptr<const PassTemplate>& passTemplate = m_passLibrary->GetPassTemplate(templateName);
  114. if (passTemplate == nullptr)
  115. {
  116. AZ_Error("PassFactory", false, "FAILED TO CREATE PASS [%s]. Could not find pass template [%s]", passName.GetCStr(), templateName.GetCStr());
  117. return nullptr;
  118. }
  119. return CreatePassFromTemplate(passTemplate, passName);
  120. }
  121. Ptr<Pass> PassFactory::CreatePassFromRequest(const PassRequest* passRequest)
  122. {
  123. if (!passRequest)
  124. {
  125. AZ_Assert(false, "PassFactory::CreatePassFromRequest() was handed a null PassRequest!");
  126. return nullptr;
  127. }
  128. const AZStd::shared_ptr<const PassTemplate>& passTemplate = m_passLibrary->GetPassTemplate(passRequest->m_templateName);
  129. if (passTemplate == nullptr)
  130. {
  131. AZ_Error("PassFactory", false, "FAILED TO CREATE PASS [%s]. Could not find pass template [%s]", passRequest->m_passName.GetCStr(), passRequest->m_templateName.GetCStr());
  132. return nullptr;
  133. }
  134. CreatorIndex index = FindCreatorIndex(passTemplate->m_passClass);
  135. if (!index.IsValid())
  136. {
  137. AZ_Error("PassFactory", false, "FAILED TO CREATE PASS [%s]. Could not find pass class [%s]", passRequest->m_passName.GetCStr(), passTemplate->m_passClass.GetCStr());
  138. return nullptr;
  139. }
  140. return CreatePassFromIndex(index, passRequest->m_passName, passTemplate, passRequest);
  141. }
  142. } // namespace RPI
  143. } // namespace AZ