ResourcePoolBuilderTest.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  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 <AzCore/Serialization/Json/JsonUtils.h>
  10. #include <Atom/RHI.Reflect/BufferPoolDescriptor.h>
  11. #include <Atom/RHI.Reflect/ImagePoolDescriptor.h>
  12. #include <Atom/RHI.Reflect/StreamingImagePoolDescriptor.h>
  13. #include <Atom/RPI.Reflect/Image/StreamingImagePoolAsset.h>
  14. #include <AzCore/Serialization/ObjectStream.h>
  15. #include <AzCore/Serialization/SerializeContext.h>
  16. #include <AzCore/Serialization/Utils.h>
  17. #include <ResourcePool/ResourcePoolBuilder.h>
  18. #include <Tests.Builders/BuilderTestFixture.h>
  19. namespace UnitTest
  20. {
  21. using namespace AZ;
  22. class ResourcePoolBuilderTests
  23. : public BuilderTestFixture
  24. {
  25. protected:
  26. AZStd::unique_ptr<RPI::StreamingImagePoolAssetHandler> m_streamingImagePoolAssetHandler;
  27. AZStd::unique_ptr<RPI::ResourcePoolAssetHandler> m_resourcePoolAssetHandler;
  28. void SetUp() override
  29. {
  30. BuilderTestFixture::SetUp();
  31. m_streamingImagePoolAssetHandler = AZStd::make_unique<RPI::StreamingImagePoolAssetHandler>();
  32. m_resourcePoolAssetHandler = AZStd::make_unique<RPI::ResourcePoolAssetHandler>();
  33. m_streamingImagePoolAssetHandler->m_serializeContext = m_context.get();
  34. m_resourcePoolAssetHandler->m_serializeContext = m_context.get();
  35. m_streamingImagePoolAssetHandler->Register();
  36. m_resourcePoolAssetHandler->Register();
  37. }
  38. void TearDown() override
  39. {
  40. m_streamingImagePoolAssetHandler->Unregister();
  41. m_resourcePoolAssetHandler->Unregister();
  42. m_streamingImagePoolAssetHandler.reset();
  43. m_resourcePoolAssetHandler.reset();
  44. BuilderTestFixture::TearDown();
  45. }
  46. };
  47. TEST_F(ResourcePoolBuilderTests, ProcessJob_OutputBufferPool)
  48. {
  49. RPI::ResourcePoolBuilder builder;
  50. AssetBuilderSDK::ProcessJobRequest request;
  51. AssetBuilderSDK::ProcessJobResponse response;
  52. AZ::Test::ScopedAutoTempDirectory productDir;
  53. AZ::Test::ScopedAutoTempDirectory sourceDir;
  54. const char* testAssetName = "TestBufferPool.resourcepool";
  55. AZ::IO::Path sourceFilePath = sourceDir.Resolve(testAssetName);
  56. // Initial job request
  57. request.m_fullPath = sourceFilePath.Native();
  58. request.m_tempDirPath = productDir.GetDirectory();
  59. RPI::ResourcePoolSourceData sourceData;
  60. sourceData.m_poolName = "DefaultIndexBufferPool";
  61. sourceData.m_poolType = RPI::ResourcePoolAssetType::BufferPool;
  62. sourceData.m_budgetInBytes = 25165824;
  63. sourceData.m_heapMemoryLevel = RHI::HeapMemoryLevel::Device;
  64. sourceData.m_hostMemoryAccess = RHI::HostMemoryAccess::Write;
  65. sourceData.m_bufferPoolBindFlags = RHI::BufferBindFlags::InputAssembly;
  66. Outcome<void, AZStd::string> saveResult = AZ::JsonSerializationUtils::SaveObjectToFile<RPI::ResourcePoolSourceData>(&sourceData,
  67. sourceFilePath.Native());
  68. // Process
  69. builder.ProcessJob(request, response);
  70. // verify job output
  71. EXPECT_TRUE(response.m_resultCode == AssetBuilderSDK::ProcessJobResult_Success);
  72. EXPECT_TRUE(response.m_outputProducts.size() == 1);
  73. EXPECT_TRUE(response.m_outputProducts[0].m_dependencies.size() == 0);
  74. // verify output file and verify loaded asset
  75. auto outAsset = Utils::LoadObjectFromFile<RPI::ResourcePoolAsset>(response.m_outputProducts[0].m_productFileName, m_context.get());
  76. auto poolDescriptor = outAsset->GetPoolDescriptor();
  77. EXPECT_TRUE(sourceData.m_poolName == outAsset->GetPoolName());
  78. EXPECT_TRUE(azrtti_typeid <RHI::BufferPoolDescriptor>() == azrtti_typeid(poolDescriptor.get()));
  79. auto bufferPoolDesc = azrtti_cast<RHI::BufferPoolDescriptor*>(poolDescriptor.get());
  80. EXPECT_TRUE(sourceData.m_budgetInBytes == bufferPoolDesc->m_budgetInBytes);
  81. EXPECT_TRUE(sourceData.m_heapMemoryLevel == bufferPoolDesc->m_heapMemoryLevel);
  82. EXPECT_TRUE(sourceData.m_hostMemoryAccess == bufferPoolDesc->m_hostMemoryAccess);
  83. EXPECT_TRUE(sourceData.m_bufferPoolBindFlags == bufferPoolDesc->m_bindFlags);
  84. delete outAsset;
  85. }
  86. TEST_F(ResourcePoolBuilderTests, ProcessJob_OutputImagePool)
  87. {
  88. RPI::ResourcePoolBuilder builder;
  89. AssetBuilderSDK::ProcessJobRequest request;
  90. AssetBuilderSDK::ProcessJobResponse response;
  91. AZ::Test::ScopedAutoTempDirectory productDir;
  92. AZ::Test::ScopedAutoTempDirectory sourceDir;
  93. const char* testAssetName = "TestImagePool.resourcepool";
  94. AZ::IO::Path sourceFilePath = sourceDir.Resolve(testAssetName);
  95. // Initial job request
  96. request.m_fullPath = sourceFilePath.Native();
  97. request.m_tempDirPath = productDir.GetDirectory();
  98. RPI::ResourcePoolSourceData sourceData;
  99. sourceData.m_poolName = "DefaultImagePool";
  100. sourceData.m_poolType = RPI::ResourcePoolAssetType::ImagePool;
  101. sourceData.m_budgetInBytes = 25165824;
  102. sourceData.m_imagePoolBindFlags = RHI::ImageBindFlags::Color;
  103. Outcome<void, AZStd::string> saveResult = AZ::JsonSerializationUtils::SaveObjectToFile<RPI::ResourcePoolSourceData>(&sourceData,
  104. sourceFilePath.Native());
  105. // Process
  106. builder.ProcessJob(request, response);
  107. // verify job output
  108. EXPECT_TRUE(response.m_resultCode == AssetBuilderSDK::ProcessJobResult_Success);
  109. EXPECT_TRUE(response.m_outputProducts.size() == 1);
  110. EXPECT_TRUE(response.m_outputProducts[0].m_dependencies.size() == 0);
  111. // verify output file and verify loaded asset
  112. auto outAsset = Utils::LoadObjectFromFile<RPI::ResourcePoolAsset>(response.m_outputProducts[0].m_productFileName, m_context.get());
  113. auto poolDescriptor = outAsset->GetPoolDescriptor();
  114. EXPECT_TRUE(sourceData.m_poolName == outAsset->GetPoolName());
  115. EXPECT_TRUE(azrtti_typeid<RHI::ImagePoolDescriptor>() == azrtti_typeid(poolDescriptor.get()));
  116. auto imagePoolDesc = azrtti_cast<RHI::ImagePoolDescriptor*>(poolDescriptor.get());
  117. EXPECT_TRUE(sourceData.m_budgetInBytes == imagePoolDesc->m_budgetInBytes);
  118. EXPECT_TRUE(sourceData.m_imagePoolBindFlags == imagePoolDesc->m_bindFlags);
  119. delete outAsset;
  120. }
  121. TEST_F(ResourcePoolBuilderTests, ProcessJob_OutputStreamingImagePool)
  122. {
  123. RPI::ResourcePoolBuilder builder;
  124. AssetBuilderSDK::ProcessJobRequest request;
  125. AssetBuilderSDK::ProcessJobResponse response;
  126. AZ::Test::ScopedAutoTempDirectory productDir;
  127. AZ::Test::ScopedAutoTempDirectory sourceDir;
  128. const char* testAssetName = "TestStreamingImagePool.resourcepool";
  129. AZ::IO::Path sourceFilePath = sourceDir.Resolve(testAssetName);
  130. // Initial job request
  131. request.m_fullPath = sourceFilePath.Native();
  132. request.m_tempDirPath = productDir.GetDirectory();
  133. RPI::ResourcePoolSourceData sourceData;
  134. sourceData.m_poolName = "DefaultStreamingImagePool";
  135. sourceData.m_poolType = RPI::ResourcePoolAssetType::StreamingImagePool;
  136. sourceData.m_budgetInBytes = 2147483648;
  137. Outcome<void, AZStd::string> saveResult = AZ::JsonSerializationUtils::SaveObjectToFile<RPI::ResourcePoolSourceData>(&sourceData,
  138. sourceFilePath.Native());
  139. // Process
  140. builder.ProcessJob(request, response);
  141. // verify job output
  142. EXPECT_TRUE(response.m_resultCode == AssetBuilderSDK::ProcessJobResult_Success);
  143. EXPECT_TRUE(response.m_outputProducts.size() == 1);
  144. EXPECT_TRUE(response.m_outputProducts[0].m_dependencies.size() == 0);
  145. // verify output file and verify loaded asset
  146. Utils::FilterDescriptor filter; // disable loading the controller asset inside
  147. filter.m_assetCB = AZ::Data::AssetFilterNoAssetLoading;
  148. auto outAsset = Utils::LoadObjectFromFile<RPI::StreamingImagePoolAsset>(response.m_outputProducts[0].m_productFileName, m_context.get(), filter);
  149. auto poolDescriptor = outAsset->GetPoolDescriptor();
  150. EXPECT_TRUE(azrtti_typeid <RHI::StreamingImagePoolDescriptor>() == azrtti_typeid(poolDescriptor));
  151. EXPECT_TRUE(sourceData.m_budgetInBytes == poolDescriptor.m_budgetInBytes);
  152. delete outAsset;
  153. }
  154. } // namespace UnitTests