RingBuffer.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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/Buffer/RingBuffer.h>
  9. namespace AZ::RPI
  10. {
  11. RingBuffer::RingBuffer(const AZStd::string& bufferName, CommonBufferPoolType bufferPoolType, RHI::Format bufferFormat)
  12. : m_bufferName{ bufferName }
  13. , m_bufferPoolType{ bufferPoolType }
  14. , m_bufferFormat{ bufferFormat }
  15. , m_elementSize{ RHI::GetFormatSize(bufferFormat) }
  16. {
  17. }
  18. RingBuffer::RingBuffer(const AZStd::string& bufferName, CommonBufferPoolType bufferPoolType, uint32_t elementSize)
  19. : m_bufferName{ bufferName }
  20. , m_bufferPoolType{ bufferPoolType }
  21. , m_elementSize{ elementSize }
  22. {
  23. }
  24. bool RingBuffer::IsCurrentBufferValid() const
  25. {
  26. return GetCurrentBuffer();
  27. }
  28. const Data::Instance<Buffer>& RingBuffer::GetCurrentBuffer() const
  29. {
  30. return GetCurrentElement();
  31. }
  32. const RHI::BufferView* RingBuffer::GetCurrentBufferView() const
  33. {
  34. return GetCurrentBuffer()->GetBufferView();
  35. }
  36. void RingBuffer::AdvanceCurrentBufferAndUpdateData(const void* data, u64 dataSizeInBytes)
  37. {
  38. AdvanceCurrentElement();
  39. CreateOrResizeCurrentBuffer(dataSizeInBytes);
  40. UpdateCurrentBufferData(data, dataSizeInBytes, 0);
  41. }
  42. void RingBuffer::AdvanceCurrentBufferAndUpdateData(const AZStd::unordered_map<int, const void *> &data, u64 dataSizeInBytes)
  43. {
  44. AdvanceCurrentElement();
  45. CreateOrResizeCurrentBuffer(dataSizeInBytes);
  46. UpdateCurrentBufferData(data, dataSizeInBytes, 0);
  47. }
  48. void RingBuffer::CreateOrResizeCurrentBuffer(u64 bufferSizeInBytes)
  49. {
  50. auto& currentBuffer{ GetCurrentElement() };
  51. if (!currentBuffer)
  52. {
  53. CommonBufferDescriptor desc;
  54. desc.m_bufferName = m_bufferName;
  55. desc.m_poolType = m_bufferPoolType;
  56. desc.m_elementSize = m_elementSize;
  57. desc.m_elementFormat = m_bufferFormat;
  58. desc.m_byteCount = bufferSizeInBytes;
  59. currentBuffer = BufferSystemInterface::Get()->CreateBufferFromCommonPool(desc);
  60. }
  61. else if (currentBuffer->GetBufferSize() < bufferSizeInBytes)
  62. {
  63. currentBuffer->Resize(bufferSizeInBytes);
  64. }
  65. }
  66. void RingBuffer::UpdateCurrentBufferData(const void* data, u64 dataSizeInBytes, u64 bufferOffsetInBytes)
  67. {
  68. auto& currentBuffer{ GetCurrentBuffer() };
  69. currentBuffer->UpdateData(data, dataSizeInBytes, bufferOffsetInBytes);
  70. }
  71. void RingBuffer::UpdateCurrentBufferData(const AZStd::unordered_map<int, const void*>& data, u64 dataSizeInBytes, u64 bufferOffsetInBytes)
  72. {
  73. auto& currentBuffer{ GetCurrentBuffer() };
  74. currentBuffer->UpdateData(data, dataSizeInBytes, bufferOffsetInBytes);
  75. }
  76. } // namespace AZ::RPI