3
0

AttachmentImage.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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::AssetId assetId;
  46. if (createImageRequest.m_isUniqueName)
  47. {
  48. assetId = AZ::Uuid::CreateName(createImageRequest.m_imageName.GetCStr());
  49. }
  50. else
  51. {
  52. assetId = AZ::Uuid::CreateRandom();
  53. }
  54. Data::InstanceId instanceId = Data::InstanceId::CreateFromAssetId(assetId);
  55. AttachmentImageAssetCreator imageAssetCreator;
  56. imageAssetCreator.Begin(assetId);
  57. imageAssetCreator.SetImageDescriptor(createImageRequest.m_imageDescriptor);
  58. imageAssetCreator.SetPoolAsset({createImageRequest.m_imagePool->GetAssetId(), azrtti_typeid<ResourcePoolAsset>()});
  59. imageAssetCreator.SetName(createImageRequest.m_imageName, createImageRequest.m_isUniqueName);
  60. if (createImageRequest.m_imageViewDescriptor)
  61. {
  62. imageAssetCreator.SetImageViewDescriptor(*createImageRequest.m_imageViewDescriptor);
  63. }
  64. if (createImageRequest.m_optimizedClearValue)
  65. {
  66. imageAssetCreator.SetOptimizedClearValue(*createImageRequest.m_optimizedClearValue);
  67. }
  68. if (imageAssetCreator.End(imageAsset))
  69. {
  70. return Data::InstanceDatabase<AttachmentImage>::Instance().FindOrCreate(instanceId, imageAsset);
  71. }
  72. return nullptr;
  73. }
  74. Data::Instance<AttachmentImage> AttachmentImage::FindByUniqueName(const Name& uniqueAttachmentName)
  75. {
  76. return ImageSystemInterface::Get()->FindRegisteredAttachmentImage(uniqueAttachmentName);
  77. }
  78. Data::Instance<AttachmentImage> AttachmentImage::CreateInternal(AttachmentImageAsset& imageAsset)
  79. {
  80. Data::Instance<AttachmentImage> image = aznew AttachmentImage();
  81. auto result = image->Init(imageAsset);
  82. if (result == RHI::ResultCode::Success)
  83. {
  84. image->m_imageAsset = { &imageAsset, AZ::Data::AssetLoadBehavior::PreLoad };
  85. return image;
  86. }
  87. return nullptr;
  88. }
  89. AttachmentImage::~AttachmentImage()
  90. {
  91. Shutdown();
  92. }
  93. RHI::ResultCode AttachmentImage::Init(const AttachmentImageAsset& imageAsset)
  94. {
  95. Data::Instance<AttachmentImagePool> pool;
  96. if (imageAsset.GetPoolAsset().GetId().IsValid())
  97. {
  98. pool = AttachmentImagePool::FindOrCreate(imageAsset.GetPoolAsset());
  99. }
  100. else
  101. {
  102. pool = ImageSystemInterface::Get()->GetSystemAttachmentPool();
  103. }
  104. if (!pool)
  105. {
  106. AZ_Error("AttachmentImage", false, "Failed to acquire the attachment image pool instance.");
  107. return RHI::ResultCode::Fail;
  108. }
  109. RHI::ImagePool* rhiPool = pool->GetRHIPool();
  110. RHI::ImageInitRequest initRequest;
  111. initRequest.m_image = GetRHIImage();
  112. initRequest.m_descriptor = imageAsset.GetImageDescriptor();
  113. initRequest.m_optimizedClearValue = imageAsset.GetOptimizedClearValue();
  114. RHI::ResultCode resultCode = rhiPool->InitImage(initRequest);
  115. if (resultCode == RHI::ResultCode::Success)
  116. {
  117. m_imagePool = pool;
  118. m_imageView = m_image->GetImageView(imageAsset.GetImageViewDescriptor());
  119. if(!m_imageView.get())
  120. {
  121. AZ_Error("AttachmentImage", false, "AttachmentImage::Init() failed to initialize RHI image view.");
  122. return RHI::ResultCode::Fail;
  123. }
  124. m_image->SetName(imageAsset.GetName());
  125. m_attachmentId = imageAsset.GetAttachmentId();
  126. if (imageAsset.HasUniqueName())
  127. {
  128. ImageSystemInterface::Get()->RegisterAttachmentImage(this);
  129. }
  130. return RHI::ResultCode::Success;
  131. }
  132. AZ_Error("AttachmentImage", false, "AttachmentImage::Init() failed to initialize RHI image [%d].", resultCode);
  133. return resultCode;
  134. }
  135. const RHI::AttachmentId& AttachmentImage::GetAttachmentId() const
  136. {
  137. return m_attachmentId;
  138. }
  139. void AttachmentImage::Shutdown()
  140. {
  141. if (m_imageAsset && m_imageAsset->HasUniqueName())
  142. {
  143. ImageSystemInterface::Get()->UnregisterAttachmentImage(this);
  144. }
  145. }
  146. }
  147. }