ShaderSourceData.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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 <Atom/RHI.Edit/Utils.h>
  9. #include <Atom/RPI.Edit/Shader/ShaderSourceData.h>
  10. #include <AzCore/RTTI/BehaviorContext.h>
  11. #include <AzCore/Serialization/EditContext.h>
  12. #include <AzCore/Serialization/SerializeContext.h>
  13. namespace AZ
  14. {
  15. namespace RPI
  16. {
  17. void ShaderSourceData::Reflect(ReflectContext* context)
  18. {
  19. if (auto serializeContext = azrtti_cast<SerializeContext*>(context))
  20. {
  21. serializeContext->Class<ShaderSourceData>()
  22. ->Version(8) // Added m_keepTempFolder flag.
  23. ->Field("Source", &ShaderSourceData::m_source)
  24. ->Field("DrawList", &ShaderSourceData::m_drawListName)
  25. ->Field("DepthStencilState", &ShaderSourceData::m_depthStencilState)
  26. ->Field("RasterState", &ShaderSourceData::m_rasterState)
  27. ->Field("BlendState", &ShaderSourceData::m_blendState)
  28. ->Field("GlobalTargetBlendState", &ShaderSourceData::m_globalTargetBlendState)
  29. ->Field("TargetBlendStates", &ShaderSourceData::m_targetBlendStates)
  30. ->Field("ProgramSettings", &ShaderSourceData::m_programSettings)
  31. ->Field("RemoveBuildArguments", &ShaderSourceData::m_removeBuildArguments)
  32. ->Field("AddBuildArguments", &ShaderSourceData::m_addBuildArguments)
  33. ->Field("Definitions", &ShaderSourceData::m_definitions)
  34. ->Field("ShaderOptions", &ShaderSourceData::m_shaderOptionValues)
  35. ->Field("DisabledRHIBackends", &ShaderSourceData::m_disabledRhiBackends)
  36. ->Field("Supervariants", &ShaderSourceData::m_supervariants)
  37. ->Field("KeepTempFolder", &ShaderSourceData::m_keepTempFolder)
  38. ;
  39. serializeContext->Class<ProgramSettings>()
  40. ->Version(1)
  41. ->Field("EntryPoints", &ProgramSettings::m_entryPoints)
  42. ;
  43. serializeContext->Class<EntryPoint>()
  44. ->Version(1)
  45. ->Field("Name", &EntryPoint::m_name)
  46. ->Field("Type", &EntryPoint::m_type)
  47. ;
  48. serializeContext->Class<SupervariantInfo>()
  49. ->Version(2) // Introduction of "AddBuildArguments" & "RemoveBuildArguments"
  50. ->Field("Name", &SupervariantInfo::m_name)
  51. ->Field("RemoveBuildArguments", &SupervariantInfo::m_removeBuildArguments)
  52. ->Field("AddBuildArguments", &SupervariantInfo::m_addBuildArguments)
  53. ->Field("Definitions", &SupervariantInfo::m_definitions)
  54. ;
  55. if (auto editContext = serializeContext->GetEditContext())
  56. {
  57. editContext->Class<ShaderSourceData>("ShaderSourceData", "")
  58. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  59. ->Attribute(AZ::Edit::Attributes::AutoExpand, true)
  60. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_source, "Source", "")
  61. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_drawListName, "Draw List", "")
  62. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_depthStencilState, "Depth Stencil State", "")
  63. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_rasterState, "Raster State", "")
  64. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_blendState, "Blend State", "")
  65. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_globalTargetBlendState, "Global Target Blend State", "")
  66. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_targetBlendStates, "Target Blend States", "")
  67. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_programSettings, "Program Settings", "")
  68. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_removeBuildArguments, "Remove Build Arguments", "")
  69. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_addBuildArguments, "Add Build Arguments", "")
  70. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_definitions, "Definitions", "")
  71. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_shaderOptionValues, "Shader Options", "")
  72. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_disabledRhiBackends, "Disabled RHI Backends", "")
  73. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_supervariants, "Super Variants", "")
  74. ->DataElement(AZ::Edit::UIHandlers::Default, &ShaderSourceData::m_keepTempFolder, "Keep Temp Folder", "Preserves the Temp folder for successful shader compilations.")
  75. ;
  76. editContext->Class<ProgramSettings>("ShaderSourceData::ProgramSettings", "")
  77. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  78. ->Attribute(AZ::Edit::Attributes::AutoExpand, false)
  79. ->DataElement(AZ::Edit::UIHandlers::Default, &ProgramSettings::m_entryPoints, "Entry Points", "")
  80. ;
  81. editContext->Class<EntryPoint>("ShaderSourceData::EntryPoint", "")
  82. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  83. ->Attribute(AZ::Edit::Attributes::AutoExpand, false)
  84. ->DataElement(AZ::Edit::UIHandlers::Default, &EntryPoint::m_name, "Name", "")
  85. ->DataElement(AZ::Edit::UIHandlers::ComboBox, &EntryPoint::m_type, "Type", "")
  86. ->EnumAttribute(ShaderStageType::Vertex, ToString(ShaderStageType::Vertex))
  87. ->EnumAttribute(ShaderStageType::Geometry, ToString(ShaderStageType::Geometry))
  88. ->EnumAttribute(ShaderStageType::TessellationControl, ToString(ShaderStageType::TessellationControl))
  89. ->EnumAttribute(ShaderStageType::TessellationEvaluation, ToString(ShaderStageType::TessellationEvaluation))
  90. ->EnumAttribute(ShaderStageType::Fragment, ToString(ShaderStageType::Fragment))
  91. ->EnumAttribute(ShaderStageType::Compute, ToString(ShaderStageType::Compute))
  92. ->EnumAttribute(ShaderStageType::RayTracing, ToString(ShaderStageType::RayTracing))
  93. ;
  94. editContext->Class<SupervariantInfo>("ShaderSourceData::SupervariantInfo", "")
  95. ->ClassElement(AZ::Edit::ClassElements::EditorData, "")
  96. ->Attribute(AZ::Edit::Attributes::AutoExpand, false)
  97. ->DataElement(AZ::Edit::UIHandlers::Default, &SupervariantInfo::m_name, "Name", "")
  98. ->DataElement(AZ::Edit::UIHandlers::Default, &SupervariantInfo::m_removeBuildArguments, "Remove Build Arguments", "")
  99. ->DataElement(AZ::Edit::UIHandlers::Default, &SupervariantInfo::m_addBuildArguments, "Add Build Arguments", "")
  100. ->DataElement(AZ::Edit::UIHandlers::Default, &SupervariantInfo::m_definitions, "Definitions", "")
  101. ;
  102. }
  103. }
  104. if (auto behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context))
  105. {
  106. // declare EntryPoint before things that use it.
  107. behaviorContext->Class<ShaderSourceData::EntryPoint>("ShaderSourceData::EntryPoint")
  108. ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation)
  109. ->Attribute(AZ::Script::Attributes::Category, "RPI")
  110. ->Attribute(AZ::Script::Attributes::Module, "rpi")
  111. ->Constructor()
  112. ->Constructor<const ShaderSourceData::EntryPoint&>()
  113. ->Property("name", BehaviorValueProperty(&EntryPoint::m_name))
  114. ->Property("type", BehaviorValueProperty(&EntryPoint::m_type))
  115. ;
  116. // Declare SupervariantInfo (which uses EntryPoint) before things that use it.
  117. behaviorContext->Class<ShaderSourceData::SupervariantInfo>("ShaderSourceData::SupervariantInfo")
  118. ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation)
  119. ->Attribute(AZ::Script::Attributes::Category, "RPI")
  120. ->Attribute(AZ::Script::Attributes::Module, "rpi")
  121. ->Constructor()
  122. ->Constructor<const ShaderSourceData::SupervariantInfo&>()
  123. ->Property("name", BehaviorValueProperty(&SupervariantInfo::m_name))
  124. ->Property("removeBuildArguments", BehaviorValueProperty(&SupervariantInfo::m_removeBuildArguments))
  125. ->Property("addBuildArguments", BehaviorValueProperty(&SupervariantInfo::m_addBuildArguments))
  126. ->Property("definitions", BehaviorValueProperty(&SupervariantInfo::m_definitions))
  127. ;
  128. // ShaderSourceData uses SuperVariant, so SuperVarient is defined above, before it.
  129. behaviorContext->Class<ShaderSourceData>("ShaderSourceData")
  130. ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation)
  131. ->Attribute(AZ::Script::Attributes::Category, "RPI")
  132. ->Attribute(AZ::Script::Attributes::Module, "rpi")
  133. ->Constructor()
  134. ->Constructor<const ShaderSourceData&>()
  135. ->Property("source", BehaviorValueProperty(&ShaderSourceData::m_source))
  136. ->Property("drawListName", BehaviorValueProperty(&ShaderSourceData::m_drawListName))
  137. ->Property("depthStencilState", BehaviorValueProperty(&ShaderSourceData::m_depthStencilState))
  138. ->Property("rasterState", BehaviorValueProperty(&ShaderSourceData::m_rasterState))
  139. ->Property("blendState", BehaviorValueProperty(&ShaderSourceData::m_blendState))
  140. ->Property("globalTargetBlendState", BehaviorValueProperty(&ShaderSourceData::m_globalTargetBlendState))
  141. ->Property("targetBlendStates", BehaviorValueProperty(&ShaderSourceData::m_targetBlendStates))
  142. ->Property("programSettings", BehaviorValueProperty(&ShaderSourceData::m_programSettings))
  143. ->Property("removeBuildArguments", BehaviorValueProperty(&ShaderSourceData::m_removeBuildArguments))
  144. ->Property("addBuildArguments", BehaviorValueProperty(&ShaderSourceData::m_addBuildArguments))
  145. ->Property("definitions", BehaviorValueProperty(&ShaderSourceData::m_definitions))
  146. ->Property("shaderOptions", BehaviorValueProperty(&ShaderSourceData::m_shaderOptionValues))
  147. ->Property("disabledRhiBackends", BehaviorValueProperty(&ShaderSourceData::m_disabledRhiBackends))
  148. ->Property("superVariants", BehaviorValueProperty(&ShaderSourceData::m_supervariants))
  149. ->Property("keepTempFolder", BehaviorValueProperty(&ShaderSourceData::m_keepTempFolder))
  150. ->Method("IsRhiBackendDisabled", &ShaderSourceData::IsRhiBackendDisabled)
  151. ;
  152. behaviorContext->Class<ShaderSourceData::ProgramSettings>("ShaderSourceData::ProgramSettings")
  153. ->Attribute(AZ::Script::Attributes::Scope, AZ::Script::Attributes::ScopeFlags::Automation)
  154. ->Attribute(AZ::Script::Attributes::Category, "RPI")
  155. ->Attribute(AZ::Script::Attributes::Module, "rpi")
  156. ->Constructor()
  157. ->Constructor<const ShaderSourceData::ProgramSettings&>()
  158. ->Property("entryPoints", BehaviorValueProperty(&ProgramSettings::m_entryPoints))
  159. ;
  160. }
  161. }
  162. bool ShaderSourceData::IsRhiBackendDisabled(const AZ::Name& rhiName) const
  163. {
  164. return AZStd::any_of(AZ_BEGIN_END(m_disabledRhiBackends), [&](const AZStd::string& currentRhiName)
  165. {
  166. return currentRhiName == rhiName.GetStringView();
  167. });
  168. }
  169. } // namespace RPI
  170. } // namespace AZ