MaterialHotReloadTest.bv.lua 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. ----------------------------------------------------------------------------------------------------
  2. --
  3. -- Copyright (c) Contributors to the Open 3D Engine Project.
  4. -- For complete copyright and license terms please see the LICENSE at the root of this distribution.
  5. --
  6. -- SPDX-License-Identifier: Apache-2.0 OR MIT
  7. --
  8. --
  9. --
  10. ----------------------------------------------------------------------------------------------------
  11. RunScript("scripts/TestEnvironment.luac")
  12. g_testCaseFolder = 'MaterialHotReloadTest'
  13. Print('Saving screenshots to ' .. NormalizePath(g_screenshotOutputFolder .. g_testCaseFolder))
  14. g_assetFolder = "materials/hotreloadtest/temp/";
  15. OpenSample('RPI/MaterialHotReloadTest')
  16. ResizeViewport(500, 500)
  17. SelectImageComparisonToleranceLevel("Level E")
  18. -- The default ShaderVariantAsyncLoader service loop delay is too long and would require this
  19. -- test script to use too long in IdleSeconds()
  20. ExecuteConsoleCommand("r_ShaderVariantAsyncLoader_ServiceLoopDelayOverride_ms 10")
  21. function IdleForReload()
  22. -- Idle for a bit to give time for assets to reload
  23. IdleSeconds(0.25)
  24. -- Just in case the above IdleSeconds were consumed by one long frame, idle for a couple more frames, since the full reload
  25. -- process can often span multiple frames.
  26. IdleFrames(3)
  27. end
  28. function SetColorRed()
  29. AssetTracking_Start()
  30. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.material")
  31. SetImguiValue('ColorA = Red', true)
  32. AssetTracking_IdleUntilExpectedAssetsFinish(10)
  33. IdleForReload()
  34. end
  35. function SetBlendingOn()
  36. AssetTracking_Start()
  37. SetImguiValue('Blending On', true)
  38. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.materialtype")
  39. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.shader")
  40. AssetTracking_IdleUntilExpectedAssetsFinish(10)
  41. IdleForReload()
  42. end
  43. function SetBlendingOff()
  44. AssetTracking_Start()
  45. SetImguiValue('Blending Off', true)
  46. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.materialtype")
  47. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.shader")
  48. AssetTracking_IdleUntilExpectedAssetsFinish(10)
  49. IdleForReload()
  50. end
  51. CaptureScreenshot(g_testCaseFolder .. '/01_Default.png')
  52. SetColorRed()
  53. CaptureScreenshot(g_testCaseFolder .. '/02_Red.png')
  54. AssetTracking_Start()
  55. SetImguiValue('ColorA = Blue', true)
  56. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.material")
  57. AssetTracking_IdleUntilExpectedAssetsFinish(10)
  58. IdleForReload()
  59. CaptureScreenshot(g_testCaseFolder .. '/03_Blue.png')
  60. AssetTracking_Start()
  61. SetImguiValue('Default Colors', true)
  62. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.material")
  63. AssetTracking_IdleUntilExpectedAssetsFinish(10)
  64. IdleForReload()
  65. CaptureScreenshot(g_testCaseFolder .. '/04_DefaultAgain.png')
  66. AssetTracking_Start()
  67. SetImguiValue('Wavy Lines', true)
  68. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.materialtype")
  69. AssetTracking_IdleUntilExpectedAssetsFinish(10)
  70. IdleForReload()
  71. CaptureScreenshot(g_testCaseFolder .. '/05_WavyLines.png')
  72. AssetTracking_Start()
  73. SetImguiValue('Vertical Pattern', true)
  74. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.materialtype")
  75. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.shader")
  76. AssetTracking_IdleUntilExpectedAssetsFinish(10)
  77. IdleForReload()
  78. CaptureScreenshot(g_testCaseFolder .. '/06_VerticalPattern.png')
  79. SetBlendingOn()
  80. CaptureScreenshot(g_testCaseFolder .. '/07_BlendingOn.png')
  81. -- This will switch to showing the "Shader Variant: Fully Baked" message
  82. AssetTracking_Start()
  83. SetImguiValue('ShaderVariantList/All', true)
  84. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.shadervariantlist", 3) -- Waiting for 3 products, the list asset and two variant assets
  85. AssetTracking_IdleUntilExpectedAssetsFinish(10)
  86. IdleForReload()
  87. CaptureScreenshot(g_testCaseFolder .. '/08_Variants_All.png')
  88. -- This will switch to showing the "Shader Variant: Root" message
  89. AssetTracking_Start()
  90. SetImguiValue('ShaderVariantList/Only Straight Lines', true)
  91. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.shadervariantlist", 2) -- Waiting for 2 products, the list asset and one variant assets
  92. AssetTracking_IdleUntilExpectedAssetsFinish(10)
  93. IdleForReload()
  94. CaptureScreenshot(g_testCaseFolder .. '/09_Variants_OnlyStraightLines.png')
  95. -- This will switch to showing the "Shader Variant: Fully Baked" message again
  96. AssetTracking_Start()
  97. SetImguiValue('ShaderVariantList/Only Wavy Lines', true)
  98. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.shadervariantlist", 2) -- Waiting for 2 products, the list asset and one variant assets
  99. AssetTracking_IdleUntilExpectedAssetsFinish(10)
  100. IdleForReload()
  101. CaptureScreenshot(g_testCaseFolder .. '/10_Variants_OnlyWavyLines.png')
  102. -- This screenshot will be identical to the one above because the variants
  103. -- are still loaded in memory even though they have been removed from disk
  104. AssetTracking_Start()
  105. SetImguiValue('ShaderVariantList/None', true)
  106. IdleSeconds(1.0) -- Idle for a bit to give time for the assets to disappear
  107. IdleForReload()
  108. CaptureScreenshot(g_testCaseFolder .. '/11_Variants_None.png')
  109. -- Now, changing the .shader file will force the shader to reload and will not find
  110. -- any baked variants, since we switched to "None" above, and so this screenshot will
  111. -- switch back to showing the "Shader Variant: Root" message.
  112. SetBlendingOff()
  113. --[GFX TODO] This test is consistently failing due to an Asset Processor bug. Re-enable this test once that is fixed.
  114. --CaptureScreenshot(g_testCaseFolder .. '/12_Variants_None_AfterUpdatingShader.png')
  115. -- Here we prepare to test a specific edge case. First, the material should be using a full baked shader variant, so we set up that precondition and verify with a screenshot.
  116. AssetTracking_Start()
  117. SetImguiValue('ShaderVariantList/All', true)
  118. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.shadervariantlist", 3) -- Waiting for 3 products, the list asset and two variant assets
  119. AssetTracking_IdleUntilExpectedAssetsFinish(10)
  120. IdleSeconds(3.0)
  121. IdleForReload()
  122. CaptureScreenshot(g_testCaseFolder .. '/13_Variants_All.png')
  123. -- Now that the material is using a fully-baked variant, modify the .azsl file to force *everything* to rebuild. In the failure case, the runtime
  124. -- holds onto the old fully-baked variant even though a new root variant is available. In the correct case, the root variant should take priority
  125. -- over the fully-baked variant because it is more recent.
  126. AssetTracking_Start()
  127. SetImguiValue('Horizontal Pattern', true)
  128. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.materialtype")
  129. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.shader")
  130. AssetTracking_ExpectAsset(g_assetFolder .. "HotReloadTest.shadervariantlist", 3) -- Waiting for 3 products, the list asset and two variant assets
  131. AssetTracking_IdleUntilExpectedAssetsFinish(10)
  132. IdleSeconds(4.0)
  133. IdleForReload()
  134. CaptureScreenshot(g_testCaseFolder .. '/14_HorizontalPattern.png')
  135. -- Test a specific scenario that was failing, where color changes fail to reload after making a shader change.
  136. SetBlendingOn()
  137. IdleForReload()
  138. SetBlendingOff()
  139. IdleForReload()
  140. SetColorRed()
  141. IdleForReload()
  142. CaptureScreenshot(g_testCaseFolder .. '/15_Red_AfterShaderReload.png')
  143. -- Clear the service loop override back to the default delay
  144. ExecuteConsoleCommand("r_ShaderVariantAsyncLoader_ServiceLoopDelayOverride_ms 0")