3
0

ShaderResourceGroupImageTests.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  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 <AzTest/AzTest.h>
  9. #include <Common/RPITestFixture.h>
  10. #include <Common/ShaderAssetTestUtils.h>
  11. #include <Atom/RPI.Public/Shader/ShaderResourceGroup.h>
  12. namespace UnitTest
  13. {
  14. using namespace AZ;
  15. using namespace RPI;
  16. class ShaderResourceGroupImageTests
  17. : public RPITestFixture
  18. {
  19. protected:
  20. RHI::Ptr<RHI::ShaderResourceGroupLayout> m_testSrgLayout;
  21. Data::Asset<ShaderAsset> m_testShaderAsset;
  22. Data::Instance<ShaderResourceGroup> m_testSrg;
  23. Data::Instance<Image> m_whiteImage;
  24. Data::Instance<Image> m_blackImage;
  25. Data::Instance<Image> m_greyImage;
  26. Ptr<RHI::ImageView> m_imageViewA;
  27. Ptr<RHI::ImageView> m_imageViewB;
  28. Ptr<RHI::ImageView> m_imageViewC;
  29. AZStd::vector<Data::Instance<Image>> m_threeImages;
  30. AZStd::vector<const RHI::ImageView*> m_threeImageViews;
  31. const RHI::ShaderInputImageIndex m_indexImageA{ 0 };
  32. const RHI::ShaderInputImageIndex m_indexImageB{ 1 };
  33. const RHI::ShaderInputImageIndex m_indexImageArray{ 2 };
  34. const RHI::ShaderInputImageIndex m_indexImageInvalid{ 3 };
  35. RHI::Ptr<RHI::ShaderResourceGroupLayout> CreateTestSrgLayout(const char* nameId)
  36. {
  37. RHI::Ptr<RHI::ShaderResourceGroupLayout> srgLayout = RHI::ShaderResourceGroupLayout::Create();
  38. srgLayout->SetName(Name(nameId));
  39. srgLayout->SetBindingSlot(0);
  40. srgLayout->AddShaderInput(RHI::ShaderInputImageDescriptor{ Name{ "MyImageA" }, RHI::ShaderInputImageAccess::Read, RHI::ShaderInputImageType::Image2D, 1, 1, 1});
  41. srgLayout->AddShaderInput(RHI::ShaderInputImageDescriptor{ Name{ "MyImageB" }, RHI::ShaderInputImageAccess::Read, RHI::ShaderInputImageType::Image2D, 1, 2, 2});
  42. srgLayout->AddShaderInput(RHI::ShaderInputImageDescriptor{ Name{ "MyImageArray" }, RHI::ShaderInputImageAccess::Read, RHI::ShaderInputImageType::Image2D, 3, 3, 3});
  43. srgLayout->Finalize();
  44. return srgLayout;
  45. }
  46. void SetUp() override
  47. {
  48. RPITestFixture::SetUp();
  49. m_testSrgLayout = CreateTestSrgLayout("TestSrg");
  50. m_testShaderAsset = CreateTestShaderAsset(Uuid::CreateRandom(), m_testSrgLayout);
  51. m_testSrg = ShaderResourceGroup::Create(m_testShaderAsset, AZ::RPI::DefaultSupervariantIndex, m_testSrgLayout->GetName());
  52. m_whiteImage = RPI::ImageSystemInterface::Get()->GetSystemImage(RPI::SystemImage::White);
  53. m_blackImage = RPI::ImageSystemInterface::Get()->GetSystemImage(RPI::SystemImage::Black);
  54. m_greyImage = RPI::ImageSystemInterface::Get()->GetSystemImage(RPI::SystemImage::Grey);
  55. m_threeImages = { m_whiteImage, m_blackImage, m_greyImage };
  56. RHI::ImageViewDescriptor imageViewDescA = RHI::ImageViewDescriptor::Create(RHI::Format::Unknown, 1, 1);
  57. m_imageViewA = m_whiteImage->GetRHIImage()->GetImageView(imageViewDescA);
  58. RHI::ImageViewDescriptor imageViewDescB = RHI::ImageViewDescriptor::Create(RHI::Format::Unknown, 2, 2);
  59. m_imageViewB = m_whiteImage->GetRHIImage()->GetImageView(imageViewDescB);
  60. RHI::ImageViewDescriptor imageViewDescC = RHI::ImageViewDescriptor::Create(RHI::Format::Unknown, 3, 3);
  61. m_imageViewC = m_whiteImage->GetRHIImage()->GetImageView(imageViewDescC);
  62. m_threeImageViews = { m_imageViewA.get(), m_imageViewB.get(), m_imageViewC.get() };
  63. }
  64. void TearDown() override
  65. {
  66. m_testShaderAsset.Reset();
  67. m_testSrgLayout = nullptr;
  68. m_testSrg = nullptr;
  69. m_threeImages = AZStd::vector<Data::Instance<Image>>();
  70. m_threeImageViews = AZStd::vector<const RHI::ImageView*>();
  71. m_imageViewA = nullptr;
  72. m_imageViewB = nullptr;
  73. m_imageViewC = nullptr;
  74. m_whiteImage = nullptr;
  75. m_blackImage = nullptr;
  76. m_greyImage = nullptr;
  77. RPITestFixture::TearDown();
  78. }
  79. };
  80. TEST_F(ShaderResourceGroupImageTests, TestInvalidInputIndex)
  81. {
  82. // Test invalid indexes for all get/set functions
  83. const int imageInvalidArrayOffset = 3;
  84. AZ_TEST_START_ASSERTTEST;
  85. // Images...
  86. EXPECT_FALSE(m_testSrg->SetImage(m_indexImageInvalid, m_whiteImage));
  87. EXPECT_FALSE(m_testSrg->GetImage(m_indexImageInvalid));
  88. EXPECT_FALSE(m_testSrg->SetImage(m_indexImageInvalid, m_whiteImage, 1));
  89. EXPECT_FALSE(m_testSrg->SetImage(m_indexImageArray, m_whiteImage, imageInvalidArrayOffset));
  90. EXPECT_FALSE(m_testSrg->GetImage(m_indexImageInvalid, 1));
  91. EXPECT_FALSE(m_testSrg->GetImage(m_indexImageArray, imageInvalidArrayOffset));
  92. EXPECT_FALSE(m_testSrg->SetImageArray(m_indexImageInvalid, m_threeImages));
  93. EXPECT_FALSE(m_testSrg->SetImageArray(m_indexImageInvalid, m_threeImages, 0));
  94. EXPECT_EQ(0, m_testSrg->GetImageArray(m_indexImageInvalid).size());
  95. // Image Views...
  96. EXPECT_FALSE(m_testSrg->SetImageView(m_indexImageInvalid, m_imageViewA.get()));
  97. EXPECT_FALSE(m_testSrg->GetImageView(m_indexImageInvalid));
  98. EXPECT_FALSE(m_testSrg->SetImageView(m_indexImageInvalid, m_imageViewA.get(), 1));
  99. EXPECT_FALSE(m_testSrg->GetImageView(m_indexImageInvalid, 1));
  100. EXPECT_FALSE(m_testSrg->SetImageView(m_indexImageArray, m_imageViewA.get(), imageInvalidArrayOffset));
  101. EXPECT_FALSE(m_testSrg->GetImageView(m_indexImageArray, imageInvalidArrayOffset));
  102. EXPECT_FALSE(m_testSrg->SetImageViewArray(m_indexImageInvalid, m_threeImageViews));
  103. EXPECT_FALSE(m_testSrg->SetImageViewArray(m_indexImageInvalid, m_threeImageViews, 0));
  104. EXPECT_EQ(0, m_testSrg->GetImageViewArray(m_indexImageInvalid).size());
  105. AZ_TEST_STOP_ASSERTTEST(18);
  106. }
  107. TEST_F(ShaderResourceGroupImageTests, TestSetGetImage)
  108. {
  109. // Test basic set/get operation...
  110. EXPECT_TRUE(m_testSrg->SetImage(m_indexImageA, m_whiteImage));
  111. EXPECT_TRUE(m_testSrg->SetImage(m_indexImageB, m_blackImage));
  112. EXPECT_EQ(m_whiteImage, m_testSrg->GetImage(m_indexImageA));
  113. EXPECT_EQ(m_blackImage, m_testSrg->GetImage(m_indexImageB));
  114. m_testSrg->Compile();
  115. EXPECT_EQ(m_whiteImage->GetImageView(), m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageA, 0));
  116. EXPECT_EQ(m_blackImage->GetImageView(), m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageB, 0));
  117. // Test changing back to null...
  118. ProcessQueuedSrgCompilations(m_testShaderAsset, m_testSrgLayout->GetName());
  119. EXPECT_TRUE(m_testSrg->SetImage(m_indexImageA, nullptr));
  120. m_testSrg->Compile();
  121. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageA));
  122. EXPECT_EQ(nullptr, m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageA, 0));
  123. }
  124. TEST_F(ShaderResourceGroupImageTests, TestSetGetImageAtOffset)
  125. {
  126. // Test basic set/get operation...
  127. EXPECT_TRUE(m_testSrg->SetImage(m_indexImageArray, m_whiteImage, 0));
  128. EXPECT_TRUE(m_testSrg->SetImage(m_indexImageArray, m_blackImage, 1));
  129. EXPECT_TRUE(m_testSrg->SetImage(m_indexImageArray, m_greyImage, 2));
  130. EXPECT_EQ(m_whiteImage, m_testSrg->GetImage(m_indexImageArray, 0));
  131. EXPECT_EQ(m_blackImage, m_testSrg->GetImage(m_indexImageArray, 1));
  132. EXPECT_EQ(m_greyImage, m_testSrg->GetImage(m_indexImageArray, 2));
  133. m_testSrg->Compile();
  134. EXPECT_EQ(m_whiteImage->GetImageView(), m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 0));
  135. EXPECT_EQ(m_blackImage->GetImageView(), m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 1));
  136. EXPECT_EQ(m_greyImage->GetImageView(), m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 2));
  137. // Test changing back to null...
  138. ProcessQueuedSrgCompilations(m_testShaderAsset, m_testSrgLayout->GetName());
  139. EXPECT_TRUE(m_testSrg->SetImage(m_indexImageArray, nullptr, 1));
  140. m_testSrg->Compile();
  141. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageArray, 1));
  142. EXPECT_EQ(nullptr, m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 1));
  143. }
  144. TEST_F(ShaderResourceGroupImageTests, TestSetGetImageArray)
  145. {
  146. // Test basic set/get operation...
  147. EXPECT_TRUE(m_testSrg->SetImageArray(m_indexImageArray, m_threeImages));
  148. m_testSrg->Compile();
  149. EXPECT_EQ(3, m_testSrg->GetImageArray(m_indexImageArray).size());
  150. EXPECT_EQ(m_threeImages[0], m_testSrg->GetImageArray(m_indexImageArray)[0]);
  151. EXPECT_EQ(m_threeImages[1], m_testSrg->GetImageArray(m_indexImageArray)[1]);
  152. EXPECT_EQ(m_threeImages[2], m_testSrg->GetImageArray(m_indexImageArray)[2]);
  153. EXPECT_EQ(m_threeImages[0], m_testSrg->GetImage(m_indexImageArray, 0));
  154. EXPECT_EQ(m_threeImages[1], m_testSrg->GetImage(m_indexImageArray, 1));
  155. EXPECT_EQ(m_threeImages[2], m_testSrg->GetImage(m_indexImageArray, 2));
  156. EXPECT_EQ(m_threeImages[0]->GetImageView(), m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 0));
  157. EXPECT_EQ(m_threeImages[1]->GetImageView(), m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 1));
  158. EXPECT_EQ(m_threeImages[2]->GetImageView(), m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 2));
  159. // Test replacing just two images including changing one image back to null...
  160. ProcessQueuedSrgCompilations(m_testShaderAsset, m_testSrgLayout->GetName());
  161. AZStd::vector<Data::Instance<Image>> alternateImages = { m_blackImage, nullptr };
  162. EXPECT_TRUE(m_testSrg->SetImageArray(m_indexImageArray, alternateImages));
  163. m_testSrg->Compile();
  164. EXPECT_TRUE(m_testSrg->GetImageArray(m_indexImageArray).size());
  165. EXPECT_EQ(m_blackImage, m_testSrg->GetImage(m_indexImageArray, 0));
  166. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageArray, 1));
  167. EXPECT_EQ(m_greyImage, m_testSrg->GetImage(m_indexImageArray, 2)); // remains unchanged
  168. }
  169. TEST_F(ShaderResourceGroupImageTests, TestSetGetImageArray_ValidationFailure)
  170. {
  171. // Make sure the no changes are made when a validation failure is detected
  172. AZStd::vector<Data::Instance<Image>> tooManyImages{ 4, m_whiteImage };
  173. AZ_TEST_START_ASSERTTEST;
  174. EXPECT_FALSE(m_testSrg->SetImageArray(m_indexImageArray, tooManyImages));
  175. AZ_TEST_STOP_ASSERTTEST(1);
  176. m_testSrg->Compile();
  177. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageArray, 0));
  178. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageArray, 1));
  179. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageArray, 2));
  180. EXPECT_EQ(nullptr, m_testSrg->GetImageView(m_indexImageArray, 0));
  181. EXPECT_EQ(nullptr, m_testSrg->GetImageView(m_indexImageArray, 1));
  182. EXPECT_EQ(nullptr, m_testSrg->GetImageView(m_indexImageArray, 2));
  183. }
  184. TEST_F(ShaderResourceGroupImageTests, TestSetImageArrayAtOffset)
  185. {
  186. AZStd::vector<Data::Instance<Image>> twoImages = { m_blackImage, m_greyImage };
  187. // Test set operation, skipping the first element...
  188. EXPECT_TRUE(m_testSrg->SetImageArray(m_indexImageArray, twoImages, 1));
  189. m_testSrg->Compile();
  190. EXPECT_EQ(3, m_testSrg->GetImageArray(m_indexImageArray).size());
  191. EXPECT_EQ(nullptr, m_testSrg->GetImageArray(m_indexImageArray)[0]);
  192. EXPECT_EQ(twoImages[0], m_testSrg->GetImageArray(m_indexImageArray)[1]);
  193. EXPECT_EQ(twoImages[1], m_testSrg->GetImageArray(m_indexImageArray)[2]);
  194. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageArray, 0));
  195. EXPECT_EQ(twoImages[0], m_testSrg->GetImage(m_indexImageArray, 1));
  196. EXPECT_EQ(twoImages[1], m_testSrg->GetImage(m_indexImageArray, 2));
  197. EXPECT_EQ(nullptr, m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 0));
  198. EXPECT_EQ(twoImages[0]->GetImageView(), m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 1));
  199. EXPECT_EQ(twoImages[1]->GetImageView(), m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 2));
  200. }
  201. TEST_F(ShaderResourceGroupImageTests, TestSetImageArrayAtOffset_ValidationFailure)
  202. {
  203. // Make sure the no changes are made when a validation failure is detected
  204. // 3 entries is too many because we will start at an offset of 1
  205. AZStd::vector<Data::Instance<Image>> tooManyImages{ 3, m_whiteImage };
  206. AZ_TEST_START_ASSERTTEST;
  207. EXPECT_FALSE(m_testSrg->SetImageArray(m_indexImageArray, tooManyImages, 1));
  208. AZ_TEST_STOP_ASSERTTEST(1);
  209. m_testSrg->Compile();
  210. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageArray, 0));
  211. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageArray, 1));
  212. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageArray, 2));
  213. EXPECT_EQ(nullptr, m_testSrg->GetImageView(m_indexImageArray, 0));
  214. EXPECT_EQ(nullptr, m_testSrg->GetImageView(m_indexImageArray, 1));
  215. EXPECT_EQ(nullptr, m_testSrg->GetImageView(m_indexImageArray, 2));
  216. }
  217. TEST_F(ShaderResourceGroupImageTests, TestSetGetImageView)
  218. {
  219. // Set some RPI::Images first, just to make sure these get cleared when setting an RPI::ImageView
  220. EXPECT_TRUE(m_testSrg->SetImage(m_indexImageA, m_blackImage));
  221. EXPECT_TRUE(m_testSrg->SetImage(m_indexImageB, m_blackImage));
  222. // Test valid set/get operation...
  223. EXPECT_TRUE(m_testSrg->SetImageView(m_indexImageA, m_imageViewA.get()));
  224. EXPECT_TRUE(m_testSrg->SetImageView(m_indexImageB, m_imageViewB.get()));
  225. m_testSrg->Compile();
  226. EXPECT_EQ(m_imageViewA, m_testSrg->GetImageView(m_indexImageA));
  227. EXPECT_EQ(m_imageViewB, m_testSrg->GetImageView(m_indexImageB));
  228. EXPECT_EQ(m_imageViewA, m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageA, 0));
  229. EXPECT_EQ(m_imageViewB, m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageB, 0));
  230. // The RPI::Image should get cleared when you set a RHI::ImageView directly
  231. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageA));
  232. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageB));
  233. }
  234. TEST_F(ShaderResourceGroupImageTests, TestSetGetImageViewAtOffset)
  235. {
  236. // Set some RPI::Images first, just to make sure these get cleared when setting an RPI::ImageView
  237. EXPECT_TRUE(m_testSrg->SetImage(m_indexImageArray, m_blackImage, 0));
  238. EXPECT_TRUE(m_testSrg->SetImage(m_indexImageArray, m_blackImage, 1));
  239. EXPECT_TRUE(m_testSrg->SetImage(m_indexImageArray, m_blackImage, 2));
  240. // Test valid set/get operation...
  241. EXPECT_TRUE(m_testSrg->SetImageView(m_indexImageArray, m_imageViewA.get(), 0));
  242. EXPECT_TRUE(m_testSrg->SetImageView(m_indexImageArray, m_imageViewB.get(), 1));
  243. EXPECT_TRUE(m_testSrg->SetImageView(m_indexImageArray, m_imageViewC.get(), 2));
  244. m_testSrg->Compile();
  245. EXPECT_EQ(m_imageViewA, m_testSrg->GetImageView(m_indexImageArray, 0));
  246. EXPECT_EQ(m_imageViewB, m_testSrg->GetImageView(m_indexImageArray, 1));
  247. EXPECT_EQ(m_imageViewC, m_testSrg->GetImageView(m_indexImageArray, 2));
  248. EXPECT_EQ(m_imageViewA, m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 0));
  249. EXPECT_EQ(m_imageViewB, m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 1));
  250. EXPECT_EQ(m_imageViewC, m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 2));
  251. // The RPI::Image should get cleared when you set a RHI::ImageView directly
  252. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageArray, 0));
  253. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageArray, 1));
  254. EXPECT_EQ(nullptr, m_testSrg->GetImage(m_indexImageArray, 2));
  255. }
  256. TEST_F(ShaderResourceGroupImageTests, TestSetGetImageViewArray)
  257. {
  258. // Test basic set/get operation...
  259. EXPECT_TRUE(m_testSrg->SetImageViewArray(m_indexImageArray, m_threeImageViews));
  260. m_testSrg->Compile();
  261. EXPECT_EQ(3, m_testSrg->GetImageViewArray(m_indexImageArray).size());
  262. EXPECT_EQ(m_threeImageViews[0], m_testSrg->GetImageViewArray(m_indexImageArray)[0]);
  263. EXPECT_EQ(m_threeImageViews[1], m_testSrg->GetImageViewArray(m_indexImageArray)[1]);
  264. EXPECT_EQ(m_threeImageViews[2], m_testSrg->GetImageViewArray(m_indexImageArray)[2]);
  265. EXPECT_EQ(m_threeImageViews[0], m_testSrg->GetImageView(m_indexImageArray, 0));
  266. EXPECT_EQ(m_threeImageViews[1], m_testSrg->GetImageView(m_indexImageArray, 1));
  267. EXPECT_EQ(m_threeImageViews[2], m_testSrg->GetImageView(m_indexImageArray, 2));
  268. EXPECT_EQ(m_threeImageViews[0], m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 0));
  269. EXPECT_EQ(m_threeImageViews[1], m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 1));
  270. EXPECT_EQ(m_threeImageViews[2], m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 2));
  271. // Test replacing just two image views including changing one back to null...
  272. ProcessQueuedSrgCompilations(m_testShaderAsset, m_testSrgLayout->GetName());
  273. AZStd::vector<const RHI::ImageView*> alternateImageViews = { m_imageViewB.get(), nullptr };
  274. EXPECT_TRUE(m_testSrg->SetImageViewArray(m_indexImageArray, alternateImageViews));
  275. m_testSrg->Compile();
  276. EXPECT_EQ(m_imageViewB, m_testSrg->GetImageView(m_indexImageArray, 0));
  277. EXPECT_EQ(nullptr, m_testSrg->GetImageView(m_indexImageArray, 1));
  278. EXPECT_EQ(m_imageViewC, m_testSrg->GetImageView(m_indexImageArray, 2)); // remains unchanged
  279. }
  280. TEST_F(ShaderResourceGroupImageTests, TestSetGetImageViewArray_ValidationFailure)
  281. {
  282. // Make sure the no changes are made when a validation failure is detected
  283. AZStd::vector<const RHI::ImageView*> tooManyImageViews{ 4, m_imageViewA.get() };
  284. AZ_TEST_START_ASSERTTEST;
  285. EXPECT_FALSE(m_testSrg->SetImageViewArray(m_indexImageArray, tooManyImageViews));
  286. AZ_TEST_STOP_ASSERTTEST(1);
  287. m_testSrg->Compile();
  288. EXPECT_EQ(nullptr, m_testSrg->GetImageView(m_indexImageArray, 0));
  289. EXPECT_EQ(nullptr, m_testSrg->GetImageView(m_indexImageArray, 1));
  290. EXPECT_EQ(nullptr, m_testSrg->GetImageView(m_indexImageArray, 2));
  291. }
  292. TEST_F(ShaderResourceGroupImageTests, TestSetImageViewArrayAtOffset)
  293. {
  294. AZStd::vector<const RHI::ImageView*> twoImageViews = { m_imageViewA.get(), m_imageViewB.get() };
  295. // Test set operation, skipping the first element...
  296. EXPECT_TRUE(m_testSrg->SetImageViewArray(m_indexImageArray, twoImageViews, 1));
  297. m_testSrg->Compile();
  298. EXPECT_EQ(3, m_testSrg->GetImageViewArray(m_indexImageArray).size());
  299. EXPECT_EQ(nullptr, m_testSrg->GetImageViewArray(m_indexImageArray)[0]);
  300. EXPECT_EQ(twoImageViews[0], m_testSrg->GetImageViewArray(m_indexImageArray)[1]);
  301. EXPECT_EQ(twoImageViews[1], m_testSrg->GetImageViewArray(m_indexImageArray)[2]);
  302. EXPECT_EQ(nullptr, m_testSrg->GetImageView(m_indexImageArray, 0));
  303. EXPECT_EQ(twoImageViews[0], m_testSrg->GetImageView(m_indexImageArray, 1));
  304. EXPECT_EQ(twoImageViews[1], m_testSrg->GetImageView(m_indexImageArray, 2));
  305. EXPECT_EQ(nullptr, m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 0));
  306. EXPECT_EQ(twoImageViews[0], m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 1));
  307. EXPECT_EQ(twoImageViews[1], m_testSrg->GetRHIShaderResourceGroup()->GetData().GetImageView(m_indexImageArray, 2));
  308. }
  309. TEST_F(ShaderResourceGroupImageTests, TestSetImageViewArrayAtOffset_ValidationFailure)
  310. {
  311. // Make sure the no changes are made when a validation failure is detected
  312. AZStd::vector<const RHI::ImageView*> tooManyImageViews{ 3, m_imageViewA.get() };
  313. AZ_TEST_START_ASSERTTEST;
  314. EXPECT_FALSE(m_testSrg->SetImageViewArray(m_indexImageArray, tooManyImageViews, 1));
  315. AZ_TEST_STOP_ASSERTTEST(1);
  316. m_testSrg->Compile();
  317. EXPECT_EQ(nullptr, m_testSrg->GetImageView(m_indexImageArray, 0));
  318. EXPECT_EQ(nullptr, m_testSrg->GetImageView(m_indexImageArray, 1));
  319. EXPECT_EQ(nullptr, m_testSrg->GetImageView(m_indexImageArray, 2));
  320. }
  321. }