DeviceBufferView.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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/RHI/DeviceBufferView.h>
  9. #include <Atom/RHI/DeviceBuffer.h>
  10. namespace AZ::RHI
  11. {
  12. ResultCode DeviceBufferView::Init(const DeviceBuffer& buffer, const BufferViewDescriptor& viewDescriptor)
  13. {
  14. if (!ValidateForInit(buffer, viewDescriptor))
  15. {
  16. return ResultCode::InvalidOperation;
  17. }
  18. if (Validation::IsEnabled())
  19. {
  20. // Check buffer view does not reach outside buffer's memory
  21. if (buffer.GetDescriptor().m_byteCount < (viewDescriptor.m_elementOffset + viewDescriptor.m_elementCount) * viewDescriptor.m_elementSize)
  22. {
  23. AZ_Warning("DeviceBufferView", false, "Buffer view out of boundaries of buffer's memory.");
  24. return ResultCode::OutOfMemory;
  25. }
  26. }
  27. m_descriptor = viewDescriptor;
  28. m_hash = buffer.GetHash();
  29. m_hash = TypeHash64(m_descriptor.GetHash(), m_hash);
  30. return DeviceResourceView::Init(buffer);
  31. }
  32. bool DeviceBufferView::ValidateForInit(const DeviceBuffer& buffer, const BufferViewDescriptor& viewDescriptor) const
  33. {
  34. if (Validation::IsEnabled())
  35. {
  36. if (IsInitialized())
  37. {
  38. AZ_Warning("DeviceBufferView", false, "Buffer view already initialized");
  39. return false;
  40. }
  41. if (!buffer.IsInitialized())
  42. {
  43. AZ_Warning("DeviceBufferView", false, "Attempting to create view from uninitialized buffer '%s'.", buffer.GetName().GetCStr());
  44. return false;
  45. }
  46. if (!CheckBitsAll(buffer.GetDescriptor().m_bindFlags, viewDescriptor.m_overrideBindFlags))
  47. {
  48. AZ_Warning("DeviceBufferView", false, "Buffer view has bind flags that are incompatible with the underlying buffer.");
  49. return false;
  50. }
  51. }
  52. return true;
  53. }
  54. const BufferViewDescriptor& DeviceBufferView::GetDescriptor() const
  55. {
  56. return m_descriptor;
  57. }
  58. const DeviceBuffer& DeviceBufferView::GetBuffer() const
  59. {
  60. return static_cast<const DeviceBuffer&>(GetResource());
  61. }
  62. bool DeviceBufferView::IsFullView() const
  63. {
  64. const BufferDescriptor& bufferDescriptor = GetBuffer().GetDescriptor();
  65. const uint32_t bufferViewSize = m_descriptor.m_elementCount * m_descriptor.m_elementSize;
  66. return m_descriptor.m_elementOffset == 0 && bufferViewSize >= bufferDescriptor.m_byteCount;
  67. }
  68. HashValue64 DeviceBufferView::GetHash() const
  69. {
  70. return m_hash;
  71. }
  72. }