BufferViewDescriptor.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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.Reflect/BufferViewDescriptor.h>
  9. #include <Atom/RHI.Reflect/Interval.h>
  10. #include <AzCore/Utils/TypeHash.h>
  11. #include <AzCore/Serialization/SerializeContext.h>
  12. namespace AZ::RHI
  13. {
  14. void BufferViewDescriptor::Reflect(AZ::ReflectContext* context)
  15. {
  16. if (auto* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  17. {
  18. serializeContext->Class<BufferViewDescriptor>()
  19. ->Version(1)
  20. ->Field("m_elementOffset", &BufferViewDescriptor::m_elementOffset)
  21. ->Field("m_elementCount", &BufferViewDescriptor::m_elementCount)
  22. ->Field("m_elementSize", &BufferViewDescriptor::m_elementSize)
  23. ->Field("m_elementFormat", &BufferViewDescriptor::m_elementFormat)
  24. ->Field("m_ignoreFrameAttachmentValidation", &BufferViewDescriptor::m_ignoreFrameAttachmentValidation)
  25. ;
  26. }
  27. }
  28. AZ::HashValue64 BufferViewDescriptor::GetHash(AZ::HashValue64 seed) const
  29. {
  30. return TypeHash64(*this, seed);
  31. }
  32. BufferViewDescriptor BufferViewDescriptor::CreateStructured(
  33. uint32_t elementOffset,
  34. uint32_t elementCount,
  35. uint32_t elementSize)
  36. {
  37. BufferViewDescriptor descriptor;
  38. descriptor.m_elementOffset = elementOffset;
  39. descriptor.m_elementCount = elementCount;
  40. descriptor.m_elementSize = elementSize;
  41. descriptor.m_elementFormat = Format::Unknown;
  42. return descriptor;
  43. }
  44. BufferViewDescriptor BufferViewDescriptor::CreateRaw(
  45. uint32_t byteOffset,
  46. uint32_t byteCount)
  47. {
  48. BufferViewDescriptor descriptor;
  49. descriptor.m_elementOffset = byteOffset >> 2;
  50. descriptor.m_elementCount = byteCount >> 2;
  51. descriptor.m_elementSize = 4;
  52. descriptor.m_elementFormat = Format::R32_UINT;
  53. return descriptor;
  54. }
  55. BufferViewDescriptor BufferViewDescriptor::CreateTyped(
  56. uint32_t elementOffset,
  57. uint32_t elementCount,
  58. Format elementFormat)
  59. {
  60. BufferViewDescriptor descriptor;
  61. descriptor.m_elementOffset = elementOffset;
  62. descriptor.m_elementCount = elementCount;
  63. descriptor.m_elementSize = GetFormatSize(elementFormat);
  64. descriptor.m_elementFormat = elementFormat;
  65. return descriptor;
  66. }
  67. BufferViewDescriptor BufferViewDescriptor::CreateRayTracingTLAS(
  68. uint32_t totalByteCount)
  69. {
  70. // TLAS format is a raw buffer with a float4 element size
  71. BufferViewDescriptor descriptor;
  72. descriptor.m_elementOffset = 0;
  73. descriptor.m_elementCount = totalByteCount / 16;
  74. descriptor.m_elementSize = 16;
  75. descriptor.m_elementFormat = Format::R32_UINT;
  76. return descriptor;
  77. }
  78. bool BufferViewDescriptor::operator==(const BufferViewDescriptor& other) const
  79. {
  80. return
  81. m_elementOffset == other.m_elementOffset &&
  82. m_elementCount == other.m_elementCount &&
  83. m_elementSize == other.m_elementSize &&
  84. m_elementFormat == other.m_elementFormat &&
  85. m_overrideBindFlags == other.m_overrideBindFlags &&
  86. m_ignoreFrameAttachmentValidation == other.m_ignoreFrameAttachmentValidation;
  87. }
  88. bool BufferViewDescriptor::OverlapsSubResource(const BufferViewDescriptor& other) const
  89. {
  90. uint32_t begin = m_elementOffset * m_elementSize;
  91. uint32_t end = begin + m_elementCount * m_elementSize - 1;
  92. uint32_t otherBegin = other.m_elementOffset * other.m_elementSize;
  93. uint32_t otherEnd = otherBegin + other.m_elementCount * other.m_elementSize - 1;
  94. return Interval(begin, end).Overlaps(Interval(otherBegin, otherEnd));
  95. }
  96. }