AcesOutputTransformLutPass.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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 <DisplayMapper/AcesOutputTransformLutPass.h>
  9. #include <Atom/Feature/ACES/AcesDisplayMapperFeatureProcessor.h>
  10. #include <Atom/RHI/FrameGraphInterface.h>
  11. #include <Atom/RHI/FrameGraphAttachmentInterface.h>
  12. #include <Atom/RPI.Public/RenderPipeline.h>
  13. #include <Atom/RPI.Public/Scene.h>
  14. #include <Atom/RPI.Public/RPIUtils.h>
  15. #include <Atom/RPI.Reflect/Pass/PassTemplate.h>
  16. #include <Atom/RPI.Reflect/Shader/ShaderAsset.h>
  17. namespace AZ
  18. {
  19. namespace Render
  20. {
  21. RPI::Ptr<AcesOutputTransformLutPass> AcesOutputTransformLutPass::Create(const RPI::PassDescriptor& descriptor)
  22. {
  23. RPI::Ptr<AcesOutputTransformLutPass> pass = aznew AcesOutputTransformLutPass(descriptor);
  24. return pass;
  25. }
  26. AcesOutputTransformLutPass::AcesOutputTransformLutPass(const RPI::PassDescriptor& descriptor)
  27. : DisplayMapperFullScreenPass(descriptor)
  28. {
  29. }
  30. AcesOutputTransformLutPass::~AcesOutputTransformLutPass()
  31. {
  32. ReleaseLutImage();
  33. }
  34. void AcesOutputTransformLutPass::InitializeInternal()
  35. {
  36. DisplayMapperFullScreenPass::InitializeInternal();
  37. AZ_Assert(m_shaderResourceGroup != nullptr, "AcesOutputTransformLutPass %s has a null shader resource group when calling Init.", GetPathName().GetCStr());
  38. if (m_shaderResourceGroup != nullptr)
  39. {
  40. m_shaderInputLutImageIndex = m_shaderResourceGroup->FindShaderInputImageIndex(Name{ "m_lut" });
  41. m_shaderInputColorImageIndex = m_shaderResourceGroup->FindShaderInputImageIndex(Name{ "m_color" });
  42. m_shaderInputShaperBiasIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_shaperBias" });
  43. m_shaderInputShaperScaleIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_shaperScale" });
  44. }
  45. }
  46. void AcesOutputTransformLutPass::SetupFrameGraphDependencies(RHI::FrameGraphInterface frameGraph)
  47. {
  48. DeclareAttachmentsToFrameGraph(frameGraph);
  49. DeclarePassDependenciesToFrameGraph(frameGraph);
  50. if (m_displayMapperLut.m_lutImage == nullptr)
  51. {
  52. AcquireLutImage();
  53. }
  54. AZ_Assert(m_displayMapperLut.m_lutImage != nullptr, "AcesOutputTransformLutPass unable to acquire LUT image");
  55. AZ::RHI::AttachmentId imageAttachmentId = AZ::RHI::AttachmentId("DisplayMapperLutImageAttachmentId");
  56. // Check and assert that the image attachment id exists (it should've been imported by the write lut pass)
  57. [[maybe_unused]] auto attachment = frameGraph.GetAttachmentDatabase().IsAttachmentValid(imageAttachmentId);
  58. AZ_Assert(attachment, "AcesOutputTransformLutPass invalid attachment \"DisplayMapperLutImageAttachmentId\"");
  59. RHI::ImageScopeAttachmentDescriptor desc;
  60. desc.m_attachmentId = imageAttachmentId;
  61. desc.m_imageViewDescriptor = m_displayMapperLut.m_lutImageViewDescriptor;
  62. desc.m_loadStoreAction.m_loadAction = AZ::RHI::AttachmentLoadAction::DontCare;
  63. frameGraph.UseShaderAttachment(desc, RHI::ScopeAttachmentAccess::Read, RHI::ScopeAttachmentStage::FragmentShader);
  64. frameGraph.SetEstimatedItemCount(1);
  65. }
  66. void AcesOutputTransformLutPass::CompileResources(const RHI::FrameGraphCompileContext& context)
  67. {
  68. AZ_Assert(m_shaderResourceGroup != nullptr, "AcesOutputTransformLutPass %s has a null shader resource group when calling FrameBeginInternal.", GetPathName().GetCStr());
  69. if (m_shaderResourceGroup != nullptr)
  70. {
  71. if (m_displayMapperLut.m_lutImageView != nullptr)
  72. {
  73. m_shaderResourceGroup->SetImageView(m_shaderInputLutImageIndex, m_displayMapperLut.m_lutImageView.get());
  74. }
  75. m_shaderResourceGroup->SetConstant(m_shaderInputShaperBiasIndex, m_shaperParams.m_bias);
  76. m_shaderResourceGroup->SetConstant(m_shaderInputShaperScaleIndex, m_shaperParams.m_scale);
  77. }
  78. BindPassSrg(context, m_shaderResourceGroup);
  79. m_shaderResourceGroup->Compile();
  80. }
  81. void AcesOutputTransformLutPass::AcquireLutImage()
  82. {
  83. auto displayMapper = m_pipeline->GetScene()->GetFeatureProcessor<AZ::Render::AcesDisplayMapperFeatureProcessor>();
  84. displayMapper->GetDisplayMapperLut(m_displayMapperLut);
  85. }
  86. void AcesOutputTransformLutPass::ReleaseLutImage()
  87. {
  88. m_displayMapperLut.m_lutImage.reset();
  89. m_displayMapperLut.m_lutImageView.reset();
  90. m_displayMapperLut = {};
  91. }
  92. void AcesOutputTransformLutPass::SetShaperParams(const ShaperParams& shaperParams)
  93. {
  94. m_shaperParams = shaperParams;
  95. }
  96. } // namespace Render
  97. } // namespace AZ