BufferPropertyTests.cpp 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  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 "RHITestFixture.h"
  9. #include <Atom/RHI/BufferProperty.h>
  10. namespace UnitTest
  11. {
  12. using namespace AZ;
  13. class BufferPropertyTests
  14. : public RHITestFixture
  15. {
  16. public:
  17. BufferPropertyTests()
  18. : RHITestFixture()
  19. {}
  20. void SetUp() override
  21. {
  22. RHITestFixture::SetUp();
  23. m_bufferDescriptor.m_byteCount = 2 * 1024;
  24. }
  25. protected:
  26. RHI::BufferProperty<int> m_property;
  27. RHI::BufferDescriptor m_bufferDescriptor;
  28. };
  29. TEST_F(BufferPropertyTests, TestNoop)
  30. {
  31. RHI::BufferProperty<double> noopProp;
  32. }
  33. TEST_F(BufferPropertyTests, TestInitialization)
  34. {
  35. EXPECT_FALSE(m_property.IsInitialized());
  36. m_property.Init(m_bufferDescriptor);
  37. EXPECT_TRUE(m_property.IsInitialized());
  38. }
  39. TEST_F(BufferPropertyTests, TesNoInit)
  40. {
  41. EXPECT_FALSE(m_property.IsInitialized());
  42. auto range = RHI::BufferSubresourceRange(m_bufferDescriptor);
  43. AZ_TEST_START_TRACE_SUPPRESSION;
  44. m_property.Set(range, 1337);
  45. auto overlapInterval = m_property.Get(range);
  46. AZ_TEST_STOP_TRACE_SUPPRESSION(2);
  47. }
  48. TEST_F(BufferPropertyTests, TestFullRange)
  49. {
  50. auto range = RHI::BufferSubresourceRange(m_bufferDescriptor);
  51. m_property.Init(m_bufferDescriptor);
  52. m_property.Set(range, 1337);
  53. auto overlapInterval = m_property.Get(range);
  54. EXPECT_EQ(overlapInterval.size(), 1);
  55. const auto& resultRange = overlapInterval.front();
  56. EXPECT_EQ(resultRange.m_range, range);
  57. EXPECT_EQ(resultRange.m_property, 1337);
  58. }
  59. TEST_F(BufferPropertyTests, TestFullRangeOver)
  60. {
  61. auto range = RHI::BufferSubresourceRange(m_bufferDescriptor);
  62. m_property.Init(m_bufferDescriptor);
  63. m_property.Set(range, 1337);
  64. auto newRange = range;
  65. newRange.m_byteSize += 1024;
  66. auto overlapInterval = m_property.Get(newRange);
  67. EXPECT_EQ(overlapInterval.size(), 1);
  68. const auto& resultRange = overlapInterval.front();
  69. EXPECT_EQ(resultRange.m_range, range);
  70. EXPECT_EQ(resultRange.m_property, 1337);
  71. }
  72. TEST_F(BufferPropertyTests, TestSetPartialRange)
  73. {
  74. auto fullRange = RHI::BufferSubresourceRange(m_bufferDescriptor);
  75. m_property.Init(m_bufferDescriptor);
  76. auto range = fullRange;
  77. range.m_byteOffset += 1;
  78. range.m_byteSize -= 1;
  79. m_property.Set(range, 1337);
  80. auto overlapInterval = m_property.Get(fullRange);
  81. EXPECT_EQ(overlapInterval.size(), 1);
  82. const auto& resultRange = overlapInterval.front();
  83. EXPECT_EQ(resultRange.m_range, range);
  84. EXPECT_EQ(resultRange.m_property, 1337);
  85. }
  86. TEST_F(BufferPropertyTests, TestGetPartialRange)
  87. {
  88. auto fullRange = RHI::BufferSubresourceRange(m_bufferDescriptor);
  89. m_property.Init(m_bufferDescriptor);
  90. m_property.Set(fullRange, 1337);
  91. auto range = fullRange;
  92. range.m_byteOffset += 1;
  93. range.m_byteSize -= 1;
  94. auto overlapInterval = m_property.Get(range);
  95. EXPECT_EQ(overlapInterval.size(), 1);
  96. const auto& resultRange = overlapInterval.front();
  97. EXPECT_EQ(resultRange.m_range, range);
  98. EXPECT_EQ(resultRange.m_property, 1337);
  99. }
  100. TEST_F(BufferPropertyTests, TestMerge)
  101. {
  102. m_property.Init(m_bufferDescriptor);
  103. auto fullRange = RHI::BufferSubresourceRange(m_bufferDescriptor);
  104. auto range1 = fullRange;
  105. range1.m_byteSize = range1.m_byteSize / 2;
  106. m_property.Set(range1, 1337);
  107. auto range2 = fullRange;
  108. range2.m_byteOffset = range1.m_byteOffset + range1.m_byteSize;
  109. range2.m_byteSize = m_bufferDescriptor.m_byteCount - range2.m_byteOffset;
  110. m_property.Set(range2, 1337);
  111. auto overlapInterval = m_property.Get(fullRange);
  112. EXPECT_EQ(overlapInterval.size(), 1);
  113. const auto& resultRange = overlapInterval.front();
  114. EXPECT_EQ(resultRange.m_range, fullRange);
  115. EXPECT_EQ(resultRange.m_property, 1337);
  116. }
  117. TEST_F(BufferPropertyTests, TestNoMergeDifferentProperty)
  118. {
  119. m_property.Init(m_bufferDescriptor);
  120. auto fullRange = RHI::BufferSubresourceRange(m_bufferDescriptor);
  121. auto range1 = fullRange;
  122. range1.m_byteSize = range1.m_byteSize / 2;
  123. m_property.Set(range1, 1337);
  124. auto range2 = fullRange;
  125. range2.m_byteOffset = range1.m_byteOffset + range1.m_byteSize;
  126. range2.m_byteSize = m_bufferDescriptor.m_byteCount - range2.m_byteOffset;
  127. m_property.Set(range2, 1338);
  128. auto overlapInterval = m_property.Get(fullRange);
  129. EXPECT_EQ(overlapInterval.size(), 2);
  130. const auto& resultRange1 = overlapInterval.front();
  131. EXPECT_EQ(resultRange1.m_range, range1);
  132. EXPECT_EQ(resultRange1.m_property, 1337);
  133. const auto& resultRange2 = overlapInterval.back();
  134. EXPECT_EQ(resultRange2.m_range, range2);
  135. EXPECT_EQ(resultRange2.m_property, 1338);
  136. }
  137. TEST_F(BufferPropertyTests, TestNoMergeNoContinous)
  138. {
  139. m_property.Init(m_bufferDescriptor);
  140. auto fullRange = RHI::BufferSubresourceRange(m_bufferDescriptor);
  141. auto range1 = fullRange;
  142. range1.m_byteSize = range1.m_byteSize / 2;
  143. m_property.Set(range1, 1337);
  144. auto range2 = fullRange;
  145. range2.m_byteOffset = range1.m_byteSize + 2;
  146. range2.m_byteSize = m_bufferDescriptor.m_byteCount - range2.m_byteOffset;
  147. m_property.Set(range2, 1337);
  148. auto overlapInterval = m_property.Get(fullRange);
  149. EXPECT_EQ(overlapInterval.size(), 2);
  150. const auto& resultRange1 = overlapInterval.front();
  151. EXPECT_EQ(resultRange1.m_range, range1);
  152. EXPECT_EQ(resultRange1.m_property, 1337);
  153. const auto& resultRange2 = overlapInterval.back();
  154. EXPECT_EQ(resultRange2.m_range, range2);
  155. EXPECT_EQ(resultRange2.m_property, 1337);
  156. }
  157. TEST_F(BufferPropertyTests, TestNoOverlap)
  158. {
  159. auto range1 = RHI::BufferSubresourceRange(m_bufferDescriptor);
  160. range1.m_byteOffset = m_bufferDescriptor.m_byteCount / 2;
  161. range1.m_byteSize = m_bufferDescriptor.m_byteCount - range1.m_byteOffset;
  162. m_property.Init(m_bufferDescriptor);
  163. m_property.Set(range1, 1337);
  164. auto range2 = range1;
  165. range2.m_byteOffset = 0;
  166. range2.m_byteSize = range1.m_byteOffset - 1;
  167. auto overlapInterval = m_property.Get(range2);
  168. EXPECT_TRUE(overlapInterval.empty());
  169. }
  170. TEST_F(BufferPropertyTests, TestMergeDifferentProperty)
  171. {
  172. auto fullRange = RHI::BufferSubresourceRange(m_bufferDescriptor);
  173. m_property.Init(m_bufferDescriptor);
  174. m_property.Set(fullRange, 1337);
  175. auto range1 = fullRange;
  176. range1.m_byteSize = fullRange.m_byteSize / 2;
  177. m_property.Set(range1, 1338);
  178. auto range2 = fullRange;
  179. range2.m_byteOffset = range1.m_byteOffset + range1.m_byteSize;
  180. m_property.Set(range2, 1338);
  181. auto overlapInterval = m_property.Get(fullRange);
  182. EXPECT_EQ(overlapInterval.size(), 1);
  183. const auto& resultRange = overlapInterval.front();
  184. EXPECT_EQ(resultRange.m_range, fullRange);
  185. EXPECT_EQ(resultRange.m_property, 1338);
  186. }
  187. TEST_F(BufferPropertyTests, TestPartialMergeDifferentProperty)
  188. {
  189. auto fullRange = RHI::BufferSubresourceRange(m_bufferDescriptor);
  190. m_property.Init(m_bufferDescriptor);
  191. m_property.Set(fullRange, 1337);
  192. auto range1 = fullRange;
  193. range1.m_byteSize = 1;
  194. m_property.Set(range1, 1338);
  195. auto range2 = fullRange;
  196. range2.m_byteOffset = fullRange.m_byteSize - 1;
  197. range2.m_byteSize = fullRange.m_byteSize - range2.m_byteOffset;
  198. m_property.Set(range2, 1338);
  199. auto newRange = fullRange;
  200. newRange.m_byteOffset = range1.m_byteSize;
  201. newRange.m_byteSize = range2.m_byteOffset - newRange.m_byteOffset;
  202. auto overlapInterval = m_property.Get(fullRange);
  203. EXPECT_EQ(overlapInterval.size(), 3);
  204. const auto& resultRange1 = overlapInterval[0];
  205. const auto& resultRange2 = overlapInterval[1];
  206. const auto& resultRange3 = overlapInterval[2];
  207. EXPECT_EQ(resultRange1.m_range, range1);
  208. EXPECT_EQ(resultRange1.m_property, 1338);
  209. EXPECT_EQ(resultRange2.m_range, newRange);
  210. EXPECT_EQ(resultRange2.m_property, 1337);
  211. EXPECT_EQ(resultRange3.m_range, range2);
  212. EXPECT_EQ(resultRange3.m_property, 1338);
  213. }
  214. TEST_F(BufferPropertyTests, TestReset)
  215. {
  216. auto range = RHI::BufferSubresourceRange(m_bufferDescriptor);
  217. m_property.Init(m_bufferDescriptor);
  218. m_property.Set(range, 1337);
  219. auto overlapInterval = m_property.Get(range);
  220. EXPECT_FALSE(overlapInterval.empty());
  221. m_property.Reset();
  222. overlapInterval = m_property.Get(range);
  223. EXPECT_TRUE(overlapInterval.empty());
  224. }
  225. }