AttachmentImage.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  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/RPI.Public/Image/AttachmentImage.h>
  9. #include <Atom/RPI.Public/Image/AttachmentImagePool.h>
  10. #include <Atom/RPI.Public/Image/ImageSystemInterface.h>
  11. #include <Atom/RPI.Reflect/Base.h>
  12. #include <Atom/RPI.Reflect/Image/AttachmentImageAsset.h>
  13. #include <Atom/RPI.Reflect/Image/AttachmentImageAssetCreator.h>
  14. #include <Atom/RHI/Factory.h>
  15. #include <Atom/RHI/ImagePool.h>
  16. #include <AtomCore/Instance/InstanceDatabase.h>
  17. namespace AZ
  18. {
  19. namespace RPI
  20. {
  21. Data::Instance<AttachmentImage> AttachmentImage::FindOrCreate(const Data::Asset<AttachmentImageAsset>& imageAsset)
  22. {
  23. return Data::InstanceDatabase<AttachmentImage>::Instance().FindOrCreate(
  24. Data::InstanceId::CreateFromAssetId(imageAsset.GetId()), imageAsset);
  25. }
  26. Data::Instance<AttachmentImage> AttachmentImage::Create(
  27. const AttachmentImagePool& imagePool,
  28. const RHI::ImageDescriptor& imageDescriptor,
  29. const Name& imageName,
  30. const RHI::ClearValue* optimizedClearValue,
  31. const RHI::ImageViewDescriptor* imageViewDescriptor)
  32. {
  33. CreateAttachmentImageRequest createImageRequest;
  34. createImageRequest.m_imagePool = &imagePool;
  35. createImageRequest.m_imageDescriptor = imageDescriptor;
  36. createImageRequest.m_imageName = imageName;
  37. createImageRequest.m_isUniqueName = false;
  38. createImageRequest.m_optimizedClearValue = optimizedClearValue;
  39. createImageRequest.m_imageViewDescriptor = imageViewDescriptor;
  40. return Create(createImageRequest);
  41. }
  42. Data::Instance<AttachmentImage> AttachmentImage::Create(const CreateAttachmentImageRequest& createImageRequest)
  43. {
  44. Data::Asset<AttachmentImageAsset> imageAsset;
  45. Data::InstanceId instanceId;
  46. if (createImageRequest.m_isUniqueName)
  47. {
  48. instanceId = Data::InstanceId::CreateName(createImageRequest.m_imageName.GetCStr());
  49. if (Data::InstanceDatabase<AttachmentImage>::Instance().Find(instanceId))
  50. {
  51. AZ_Error("AttchmentImage", false, "AttachmentImage with an unique name '%s' was already created", createImageRequest.m_imageName.GetCStr());
  52. return nullptr;
  53. }
  54. }
  55. else
  56. {
  57. instanceId = Data::InstanceId::CreateRandom();
  58. }
  59. AttachmentImageAssetCreator imageAssetCreator;
  60. imageAssetCreator.Begin(instanceId.GetGuid());
  61. imageAssetCreator.SetImageDescriptor(createImageRequest.m_imageDescriptor);
  62. imageAssetCreator.SetPoolAsset({createImageRequest.m_imagePool->GetAssetId(), azrtti_typeid<ResourcePoolAsset>()});
  63. imageAssetCreator.SetName(createImageRequest.m_imageName, createImageRequest.m_isUniqueName);
  64. if (createImageRequest.m_imageViewDescriptor)
  65. {
  66. imageAssetCreator.SetImageViewDescriptor(*createImageRequest.m_imageViewDescriptor);
  67. }
  68. if (createImageRequest.m_optimizedClearValue)
  69. {
  70. imageAssetCreator.SetOptimizedClearValue(*createImageRequest.m_optimizedClearValue);
  71. }
  72. if (imageAssetCreator.End(imageAsset))
  73. {
  74. return Data::InstanceDatabase<AttachmentImage>::Instance().FindOrCreate(instanceId, imageAsset);
  75. }
  76. return nullptr;
  77. }
  78. Data::Instance<AttachmentImage> AttachmentImage::FindByUniqueName(const Name& uniqueAttachmentName)
  79. {
  80. return ImageSystemInterface::Get()->FindRegisteredAttachmentImage(uniqueAttachmentName);
  81. }
  82. Data::Instance<AttachmentImage> AttachmentImage::CreateInternal(AttachmentImageAsset& imageAsset)
  83. {
  84. Data::Instance<AttachmentImage> image = aznew AttachmentImage();
  85. auto result = image->Init(imageAsset);
  86. if (result == RHI::ResultCode::Success)
  87. {
  88. image->m_imageAsset = { &imageAsset, AZ::Data::AssetLoadBehavior::PreLoad };
  89. return image;
  90. }
  91. return nullptr;
  92. }
  93. AttachmentImage::~AttachmentImage()
  94. {
  95. Shutdown();
  96. }
  97. RHI::ResultCode AttachmentImage::Init(const AttachmentImageAsset& imageAsset)
  98. {
  99. Data::Instance<AttachmentImagePool> pool;
  100. if (imageAsset.GetPoolAsset().GetId().IsValid())
  101. {
  102. pool = AttachmentImagePool::FindOrCreate(imageAsset.GetPoolAsset());
  103. }
  104. else
  105. {
  106. pool = ImageSystemInterface::Get()->GetSystemAttachmentPool();
  107. }
  108. if (!pool)
  109. {
  110. AZ_Error("AttachmentImage", false, "Failed to acquire the attachment image pool instance.");
  111. return RHI::ResultCode::Fail;
  112. }
  113. RHI::ImagePool* rhiPool = pool->GetRHIPool();
  114. RHI::ImageInitRequest initRequest;
  115. initRequest.m_image = GetRHIImage();
  116. initRequest.m_descriptor = imageAsset.GetImageDescriptor();
  117. initRequest.m_optimizedClearValue = imageAsset.GetOptimizedClearValue();
  118. RHI::ResultCode resultCode = rhiPool->InitImage(initRequest);
  119. if (resultCode == RHI::ResultCode::Success)
  120. {
  121. m_imagePool = pool;
  122. m_imageView = m_image->GetImageView(imageAsset.GetImageViewDescriptor());
  123. if(!m_imageView.get())
  124. {
  125. AZ_Error("AttachmentImage", false, "AttachmentImage::Init() failed to initialize RHI image view.");
  126. return RHI::ResultCode::Fail;
  127. }
  128. m_image->SetName(imageAsset.GetName());
  129. m_attachmentId = imageAsset.GetAttachmentId();
  130. if (imageAsset.HasUniqueName())
  131. {
  132. ImageSystemInterface::Get()->RegisterAttachmentImage(this);
  133. }
  134. return RHI::ResultCode::Success;
  135. }
  136. AZ_Error("AttachmentImage", false, "AttachmentImage::Init() failed to initialize RHI image [%d].", resultCode);
  137. return resultCode;
  138. }
  139. const RHI::AttachmentId& AttachmentImage::GetAttachmentId() const
  140. {
  141. return m_attachmentId;
  142. }
  143. void AttachmentImage::Shutdown()
  144. {
  145. if (m_imageAsset && m_imageAsset->HasUniqueName())
  146. {
  147. ImageSystemInterface::Get()->UnregisterAttachmentImage(this);
  148. }
  149. }
  150. }
  151. }