3
0

ShaderAssetTestUtils.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  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/Factory.h>
  9. #include <Atom/RHI/RHISystemInterface.h>
  10. #include <Atom/RHI.Reflect/ShaderStageFunction.h>
  11. #include <Atom/RPI.Reflect/Shader/ShaderAssetCreator.h>
  12. #include <Atom/RPI.Edit/Shader/ShaderVariantAssetCreator.h>
  13. #include <Common/RHI/Stubs.h>
  14. #include "ShaderAssetTestUtils.h"
  15. namespace UnitTest
  16. {
  17. template<class T>
  18. void AddShaderInputToBindingInfo(AZ::RHI::ShaderResourceGroupBindingInfo& bindingInfo, const T& shaderInputs)
  19. {
  20. for (const auto& shaderInput : shaderInputs)
  21. {
  22. bindingInfo.m_resourcesRegisterMap.insert(
  23. { shaderInput.m_name.GetStringView(),
  24. AZ::RHI::ResourceBindingInfo{ AZ::RHI::ShaderStageMask::Vertex, shaderInput.m_registerId, shaderInput.m_spaceId } });
  25. }
  26. }
  27. static AZ::RHI::ShaderResourceGroupBindingInfo CreateShaderResourceGroupBindingInfo(const AZ::RHI::ShaderResourceGroupLayout* layout)
  28. {
  29. using namespace AZ;
  30. RHI::ShaderResourceGroupBindingInfo bindingInfo;
  31. if (!layout)
  32. {
  33. return bindingInfo;
  34. }
  35. if (layout->GetConstantDataSize())
  36. {
  37. // All constant in the SRG use the same the register id.
  38. bindingInfo.m_constantDataBindingInfo.m_registerId = layout->GetShaderInputListForConstants()[0].m_registerId;
  39. }
  40. AddShaderInputToBindingInfo(bindingInfo, layout->GetShaderInputListForBuffers());
  41. AddShaderInputToBindingInfo(bindingInfo, layout->GetShaderInputListForSamplers());
  42. AddShaderInputToBindingInfo(bindingInfo, layout->GetShaderInputListForImages());
  43. AddShaderInputToBindingInfo(bindingInfo, layout->GetStaticSamplers());
  44. return bindingInfo;
  45. }
  46. static AZ::Data::Asset<AZ::RPI::ShaderVariantAsset> CreateTestShaderVariantAsset(
  47. AZ::RPI::ShaderVariantId id,
  48. AZ::RPI::ShaderVariantStableId stableId,
  49. const AZStd::vector<AZ::RHI::ShaderStage>& stagesToActivate = { AZ::RHI::ShaderStage::Vertex, AZ::RHI::ShaderStage::Fragment })
  50. {
  51. using namespace AZ;
  52. RPI::ShaderVariantAssetCreator shaderVariantAssetCreator;
  53. shaderVariantAssetCreator.Begin(Uuid::CreateRandom(), id, stableId, false);
  54. for (RHI::ShaderStage rhiStage : stagesToActivate)
  55. {
  56. RHI::Ptr<RHI::ShaderStageFunction> shaderStageFunction = aznew StubRHI::ShaderStageFunction;
  57. shaderVariantAssetCreator.SetShaderFunction(rhiStage, shaderStageFunction);
  58. }
  59. Data::Asset<RPI::ShaderVariantAsset> shaderVariantAsset;
  60. shaderVariantAssetCreator.End(shaderVariantAsset);
  61. return shaderVariantAsset;
  62. }
  63. AZ::Data::Asset<AZ::RPI::ShaderAsset> CreateTestShaderAsset(
  64. const AZ::Data::AssetId& shaderAssetId,
  65. AZ::RHI::Ptr<AZ::RHI::ShaderResourceGroupLayout> optionalSrgLayout,
  66. AZ::RPI::Ptr<AZ::RPI::ShaderOptionGroupLayout> optionalShaderOptions,
  67. const AZ::Name& shaderName,
  68. const AZ::Name& drawListName)
  69. {
  70. using namespace AZ;
  71. using namespace RPI;
  72. using namespace RHI;
  73. Data::Asset<ShaderAsset> shaderAsset;
  74. RHI::Ptr<RHI::PipelineLayoutDescriptor> pipelineLayoutDescriptor = RHI::PipelineLayoutDescriptor::Create();
  75. if (optionalSrgLayout)
  76. {
  77. const RHI::ShaderResourceGroupLayout* layout = optionalSrgLayout.get();
  78. RHI::ShaderResourceGroupBindingInfo bindingInfo = CreateShaderResourceGroupBindingInfo(layout);
  79. pipelineLayoutDescriptor->AddShaderResourceGroupLayoutInfo(*layout, bindingInfo);
  80. }
  81. pipelineLayoutDescriptor->Finalize();
  82. if (!optionalShaderOptions)
  83. {
  84. optionalShaderOptions = RPI::ShaderOptionGroupLayout::Create();
  85. optionalShaderOptions->Finalize();
  86. }
  87. ShaderAssetCreator creator;
  88. creator.Begin(shaderAssetId);
  89. creator.SetName(shaderName);
  90. creator.SetDrawListName(drawListName);
  91. creator.SetDrawListName(drawListName);
  92. creator.SetShaderOptionGroupLayout(optionalShaderOptions);
  93. creator.BeginAPI(RHI::Factory::Get().GetType());
  94. creator.BeginSupervariant(AZ::Name{}); // The default (first) supervariant MUST be nameless.
  95. if (optionalSrgLayout)
  96. {
  97. creator.SetSrgLayoutList({ optionalSrgLayout });
  98. }
  99. creator.SetPipelineLayout(pipelineLayoutDescriptor);
  100. //creator.SetRenderStates(m_renderStates);
  101. //creator.SetInputContract(CreateSimpleShaderInputContract());
  102. //creator.SetOutputContract(CreateSimpleShaderOutputContract());
  103. RHI::ShaderStageAttributeMapList attributeMaps;
  104. attributeMaps.resize(RHI::ShaderStageCount);
  105. creator.SetShaderStageAttributeMapList(attributeMaps);
  106. Data::Asset<RPI::ShaderVariantAsset> shaderVariantAsset =
  107. CreateTestShaderVariantAsset(RPI::ShaderVariantId{}, RPI::ShaderVariantStableId{ 0 });
  108. creator.SetRootShaderVariantAsset(shaderVariantAsset);
  109. creator.EndSupervariant();
  110. creator.EndAPI();
  111. creator.End(shaderAsset);
  112. return shaderAsset;
  113. }
  114. }