3
0

GpuBufferHandler.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  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/Feature/Utils/GpuBufferHandler.h>
  9. #include <Atom/RHI/Buffer.h>
  10. #include <Atom/RHI/Factory.h>
  11. #include <Atom/RPI.Public/Buffer/BufferSystemInterface.h>
  12. #include <Atom/Utils/Utils.h>
  13. #include <cinttypes>
  14. namespace AZ
  15. {
  16. namespace Render
  17. {
  18. [[maybe_unused]] static const char* ClassName = "GpuBufferHandler";
  19. static const uint32_t BufferMinSize = 1 << 16; // Min 64Kb.
  20. GpuBufferHandler::GpuBufferHandler(const Descriptor& descriptor)
  21. {
  22. m_elementSize = descriptor.m_elementSize;
  23. m_elementCount = 0;
  24. m_bufferIndex = descriptor.m_srgLayout->FindShaderInputBufferIndex(Name(descriptor.m_bufferSrgName));
  25. AZ_Error(ClassName, m_bufferIndex.IsValid(), "Unable to find %s in %s shader resource group.", descriptor.m_bufferSrgName.c_str(), descriptor.m_srgLayout->GetName().GetCStr());
  26. if (!descriptor.m_elementCountSrgName.empty())
  27. {
  28. m_elementCountIndex = descriptor.m_srgLayout->FindShaderInputConstantIndex(Name(descriptor.m_elementCountSrgName));
  29. AZ_Error(ClassName, m_elementCountIndex.IsValid(), "Unable to find %s in %s shader resource group.", descriptor.m_elementCountSrgName.c_str(), descriptor.m_srgLayout->GetName().GetCStr());
  30. }
  31. if (m_bufferIndex.IsValid())
  32. {
  33. uint32_t byteCount = RHI::NextPowerOfTwo(GetMax<uint32_t>(BufferMinSize, m_elementCount * m_elementSize));
  34. RPI::CommonBufferDescriptor desc;
  35. desc.m_poolType = RPI::CommonBufferPoolType::ReadOnly;
  36. desc.m_bufferName = descriptor.m_bufferName;
  37. desc.m_byteCount = byteCount;
  38. desc.m_elementSize = descriptor.m_elementSize;
  39. m_buffer = RPI::BufferSystemInterface::Get()->CreateBufferFromCommonPool(desc);
  40. }
  41. }
  42. bool GpuBufferHandler::IsValid() const
  43. {
  44. // Consider this is valid if the buffer is valid.
  45. return m_buffer;
  46. }
  47. void GpuBufferHandler::Release()
  48. {
  49. m_buffer = nullptr;
  50. m_bufferIndex.Reset();
  51. m_elementCountIndex.Reset();
  52. }
  53. bool GpuBufferHandler::UpdateBuffer(uint32_t elementCount, const void* data)
  54. {
  55. if (!IsValid())
  56. {
  57. return false;
  58. }
  59. m_elementCount = elementCount;
  60. AZ::u64 currentByteCount = m_buffer->GetBufferSize();
  61. uint32_t dataSize = elementCount * m_elementSize;
  62. if (dataSize > currentByteCount)
  63. {
  64. uint32_t byteCount = RHI::NextPowerOfTwo(GetMax<uint32_t>(BufferMinSize, dataSize));
  65. m_buffer->Resize(byteCount);
  66. }
  67. if (dataSize > 0)
  68. {
  69. return m_buffer->UpdateData(data, dataSize, 0);
  70. }
  71. return true;
  72. }
  73. void GpuBufferHandler::UpdateSrg(RPI::ShaderResourceGroup* srg) const
  74. {
  75. if (m_bufferIndex.IsValid())
  76. {
  77. srg->SetBufferView(m_bufferIndex, m_buffer->GetBufferView());
  78. }
  79. if (m_elementCountIndex.IsValid())
  80. {
  81. srg->SetConstant<uint32_t>(m_elementCountIndex, m_elementCount);
  82. }
  83. }
  84. } // namespace Render
  85. } // namespace AZ