ImagePropertyTests.cpp 10 KB

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