TransientAttachmentPool.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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 <Tests/TransientAttachmentPool.h>
  9. #include <Atom/RHI.Reflect/TransientImageDescriptor.h>
  10. #include <Atom/RHI.Reflect/TransientBufferDescriptor.h>
  11. #include <Atom/RHI/DeviceBufferPool.h>
  12. #include <Atom/RHI/DeviceImagePool.h>
  13. #include <Atom/RHI/DeviceBuffer.h>
  14. namespace UnitTest
  15. {
  16. using namespace AZ;
  17. RHI::ResultCode TransientAttachmentPool::InitInternal(RHI::Device& device, const RHI::TransientAttachmentPoolDescriptor&)
  18. {
  19. {
  20. m_imagePool = RHI::Factory::Get().CreateImagePool();
  21. RHI::ImagePoolDescriptor desc;
  22. desc.m_bindFlags = RHI::ImageBindFlags::ShaderReadWrite;
  23. m_imagePool->Init(device, desc);
  24. }
  25. {
  26. m_bufferPool = RHI::Factory::Get().CreateBufferPool();
  27. RHI::BufferPoolDescriptor desc;
  28. desc.m_bindFlags = RHI::BufferBindFlags::ShaderReadWrite;
  29. m_bufferPool->Init(device, desc);
  30. }
  31. return RHI::ResultCode::Success;
  32. }
  33. void TransientAttachmentPool::ShutdownInternal()
  34. {
  35. m_imagePool = nullptr;
  36. m_bufferPool = nullptr;
  37. m_attachments.clear();
  38. }
  39. void TransientAttachmentPool::BeginInternal([[maybe_unused]] const RHI::TransientAttachmentPoolCompileFlags flags, [[maybe_unused]] const RHI::TransientAttachmentStatistics::MemoryUsage* memoryHint)
  40. {
  41. }
  42. RHI::DeviceImage* TransientAttachmentPool::ActivateImage(
  43. const RHI::TransientImageDescriptor& descriptor)
  44. {
  45. using namespace AZ;
  46. auto findIt = m_attachments.find(descriptor.m_attachmentId);
  47. if (findIt != m_attachments.end())
  48. {
  49. return azrtti_cast<RHI::DeviceImage*>(findIt->second.get());
  50. }
  51. RHI::Ptr<RHI::DeviceImage> image = RHI::Factory::Get().CreateImage();
  52. RHI::DeviceImageInitRequest request;
  53. request.m_image = image.get();
  54. request.m_descriptor = descriptor.m_imageDescriptor;
  55. m_imagePool->InitImage(request);
  56. m_attachments.emplace(descriptor.m_attachmentId, image);
  57. m_activeSet.emplace(descriptor.m_attachmentId);
  58. return image.get();
  59. }
  60. RHI::DeviceBuffer* TransientAttachmentPool::ActivateBuffer(
  61. const RHI::TransientBufferDescriptor& descriptor)
  62. {
  63. using namespace AZ;
  64. auto findIt = m_attachments.find(descriptor.m_attachmentId);
  65. if (findIt != m_attachments.end())
  66. {
  67. return azrtti_cast<RHI::DeviceBuffer*>(findIt->second.get());
  68. }
  69. RHI::Ptr<RHI::DeviceBuffer> buffer = RHI::Factory::Get().CreateBuffer();
  70. RHI::DeviceBufferInitRequest request;
  71. request.m_descriptor = descriptor.m_bufferDescriptor;
  72. request.m_buffer = buffer.get();
  73. m_bufferPool->InitBuffer(request);
  74. m_attachments.emplace(descriptor.m_attachmentId, buffer);
  75. m_activeSet.emplace(descriptor.m_attachmentId);
  76. return buffer.get();
  77. }
  78. void TransientAttachmentPool::DeactivateBuffer(const RHI::AttachmentId& attachmentId)
  79. {
  80. AZ_Assert(m_activeSet.find(attachmentId) != m_activeSet.end(), "buffer not in the active set.");
  81. m_activeSet.erase(attachmentId);
  82. }
  83. void TransientAttachmentPool::DeactivateImage(const RHI::AttachmentId& attachmentId)
  84. {
  85. AZ_Assert(m_activeSet.find(attachmentId) != m_activeSet.end(), "image not in the active set.");
  86. m_activeSet.erase(attachmentId);
  87. }
  88. void TransientAttachmentPool::EndInternal()
  89. {
  90. AZ_Assert(m_currentScope == nullptr, "Scope not properly ended.");
  91. AZ_Assert(m_activeSet.empty(), "active set is not empty.");
  92. m_attachments.clear();
  93. }
  94. }