AcesOutputTransformPass.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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/AcesOutputTransformPass.h>
  9. #include <ACES/Aces.h>
  10. #include <Atom/Feature/ACES/AcesDisplayMapperFeatureProcessor.h>
  11. #include <Atom/RPI.Public/Pass/PassUtils.h>
  12. #include <Atom/RPI.Public/Pass/PassFactory.h>
  13. #include <Atom/RPI.Public/RenderPipeline.h>
  14. #include <Atom/RPI.Public/RPIUtils.h>
  15. #include <Atom/RPI.Public/View.h>
  16. #include <Atom/RPI.Reflect/Pass/PassTemplate.h>
  17. #include <Atom/RPI.Reflect/Shader/ShaderAsset.h>
  18. #include <Atom/RHI/Factory.h>
  19. #include <Atom/RHI/FrameScheduler.h>
  20. #include <Atom/RHI/DevicePipelineState.h>
  21. #include <AzCore/Asset/AssetCommon.h>
  22. #include <AzCore/Asset/AssetManagerBus.h>
  23. namespace AZ
  24. {
  25. namespace Render
  26. {
  27. RPI::Ptr<AcesOutputTransformPass> AcesOutputTransformPass::Create(const RPI::PassDescriptor& descriptor)
  28. {
  29. RPI::Ptr<AcesOutputTransformPass> pass = aznew AcesOutputTransformPass(descriptor);
  30. return pass;
  31. }
  32. AcesOutputTransformPass::AcesOutputTransformPass(const RPI::PassDescriptor& descriptor)
  33. : DisplayMapperFullScreenPass(descriptor)
  34. {
  35. }
  36. void AcesOutputTransformPass::InitializeInternal()
  37. {
  38. DisplayMapperFullScreenPass::InitializeInternal();
  39. AZ_Assert(m_shaderResourceGroup != nullptr, "AcesOutputTransformPass %s has a null shader resource group when calling Init.", GetPathName().GetCStr());
  40. if (m_shaderResourceGroup != nullptr)
  41. {
  42. m_shaderInputColorMatIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_XYZtoDisplayPrimaries" });
  43. m_shaderInputCinemaLimitsIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_cinemaLimits" });
  44. m_shaderInputAcesSplineParamsIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_acesSplineParams" });
  45. m_shaderInputFlagsIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_outputDisplayTransformFlags" });
  46. m_shaderInputOutputModeIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_outputDisplayTransformMode" });
  47. m_shaderInputSurroundGammaIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_surroundGamma" });
  48. m_shaderInputGammaIndex = m_shaderResourceGroup->FindShaderInputConstantIndex(Name{ "m_gamma" });
  49. }
  50. }
  51. void AcesOutputTransformPass::CompileResources(const RHI::FrameGraphCompileContext& context)
  52. {
  53. AZ_Assert(m_shaderResourceGroup != nullptr, "AcesOutputTransformPass %s has a null shader resource group when calling FrameBeginInternal.", GetPathName().GetCStr());
  54. if (m_shaderResourceGroup != nullptr)
  55. {
  56. m_shaderResourceGroup->SetConstant(m_shaderInputColorMatIndex, m_displayMapperParameters.m_XYZtoDisplayPrimaries);
  57. m_shaderResourceGroup->SetConstant(m_shaderInputCinemaLimitsIndex, m_displayMapperParameters.m_cinemaLimits);
  58. m_shaderResourceGroup->SetConstantRaw(m_shaderInputAcesSplineParamsIndex, &m_displayMapperParameters.m_acesSplineParams, sizeof(SegmentedSplineParamsC9));
  59. m_shaderResourceGroup->SetConstant(m_shaderInputFlagsIndex, m_displayMapperParameters.m_OutputDisplayTransformFlags);
  60. m_shaderResourceGroup->SetConstant(m_shaderInputOutputModeIndex, m_displayMapperParameters.m_OutputDisplayTransformMode);
  61. m_shaderResourceGroup->SetConstant(m_shaderInputSurroundGammaIndex, m_displayMapperParameters.m_surroundGamma);
  62. m_shaderResourceGroup->SetConstant(m_shaderInputGammaIndex, m_displayMapperParameters.m_gamma);
  63. }
  64. BindPassSrg(context, m_shaderResourceGroup);
  65. m_shaderResourceGroup->Compile();
  66. }
  67. void AcesOutputTransformPass::SetDisplayBufferFormat(RHI::Format format)
  68. {
  69. if (m_displayBufferFormat != format)
  70. {
  71. m_displayBufferFormat = format;
  72. if (m_displayBufferFormat == RHI::Format::R8G8B8A8_UNORM ||
  73. m_displayBufferFormat == RHI::Format::B8G8R8A8_UNORM)
  74. {
  75. AcesDisplayMapperFeatureProcessor::GetAcesDisplayMapperParameters(&m_displayMapperParameters, OutputDeviceTransformType_48Nits);
  76. }
  77. else if (m_displayBufferFormat == RHI::Format::R10G10B10A2_UNORM)
  78. {
  79. AcesDisplayMapperFeatureProcessor::GetAcesDisplayMapperParameters(&m_displayMapperParameters, OutputDeviceTransformType_1000Nits);
  80. }
  81. else
  82. {
  83. AZ_Assert(false, "Not yet supported.");
  84. // To work normally on unsupported environment, initialize the display parameters by OutputDeviceTransformType_48Nits.
  85. AcesDisplayMapperFeatureProcessor::GetAcesDisplayMapperParameters(&m_displayMapperParameters, OutputDeviceTransformType_48Nits);
  86. }
  87. }
  88. if (m_acesParameterOverrides.m_overrideDefaults)
  89. {
  90. m_displayMapperParameters.m_OutputDisplayTransformFlags = 0;
  91. if (m_acesParameterOverrides.m_alterSurround)
  92. {
  93. m_displayMapperParameters.m_OutputDisplayTransformFlags |= AcesDisplayMapperFeatureProcessor::AlterSurround;
  94. }
  95. if (m_acesParameterOverrides.m_applyDesaturation)
  96. {
  97. m_displayMapperParameters.m_OutputDisplayTransformFlags |= AcesDisplayMapperFeatureProcessor::ApplyDesaturation;
  98. }
  99. if (m_acesParameterOverrides.m_applyCATD60toD65)
  100. {
  101. m_displayMapperParameters.m_OutputDisplayTransformFlags |= AcesDisplayMapperFeatureProcessor::ApplyCATD60toD65;
  102. }
  103. m_displayMapperParameters.m_cinemaLimits[0] = m_acesParameterOverrides.m_cinemaLimitsBlack;
  104. m_displayMapperParameters.m_cinemaLimits[1] = m_acesParameterOverrides.m_cinemaLimitsWhite;
  105. m_displayMapperParameters.m_acesSplineParams.minPoint[0] = m_acesParameterOverrides.m_minPoint;
  106. m_displayMapperParameters.m_acesSplineParams.midPoint[0] = m_acesParameterOverrides.m_midPoint;
  107. m_displayMapperParameters.m_acesSplineParams.maxPoint[0] = m_acesParameterOverrides.m_maxPoint;
  108. m_displayMapperParameters.m_surroundGamma = m_acesParameterOverrides.m_surroundGamma;
  109. m_displayMapperParameters.m_gamma = m_acesParameterOverrides.m_gamma;
  110. }
  111. }
  112. void AcesOutputTransformPass::SetAcesParameterOverrides(const AcesParameterOverrides& acesParameterOverrides)
  113. {
  114. m_acesParameterOverrides = acesParameterOverrides;
  115. }
  116. } // namespace Render
  117. } // namespace AZ