浏览代码

ASV updates to match the FrameCapture changes

rgba16f 3 年之前
父节点
当前提交
47823f5666

+ 35 - 5
Gem/Code/Source/Automation/ScriptManager.cpp

@@ -1451,7 +1451,13 @@ namespace AtomSampleViewer
             // Note this will pause the script until the capture is complete
             if (PrepareForScreenCapture(filePath))
             {
-                AZ::Render::FrameCaptureRequestBus::Broadcast(&AZ::Render::FrameCaptureRequestBus::Events::CaptureScreenshot, filePath);
+                AZ_Assert(s_instance->m_frameCaptureId == AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId, "Attempting to start a capture while one is in progress");
+                uint32_t frameCaptureId = AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId;
+                AZ::Render::FrameCaptureRequestBus::BroadcastResult(frameCaptureId, &AZ::Render::FrameCaptureRequestBus::Events::CaptureScreenshot, filePath);
+                if (frameCaptureId != AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId)
+                {
+                    s_instance->m_frameCaptureId = frameCaptureId;
+                }
             }
         };
 
@@ -1478,7 +1484,13 @@ namespace AtomSampleViewer
             // Note this will pause the script until the capture is complete
             if (PrepareForScreenCapture(filePath))
             {
-                AZ::Render::FrameCaptureRequestBus::Broadcast(&AZ::Render::FrameCaptureRequestBus::Events::CaptureScreenshot, filePath);
+                AZ_Assert(s_instance->m_frameCaptureId == AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId, "Attempting to start a capture while one is in progress");
+                uint32_t frameCaptureId = AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId;
+                AZ::Render::FrameCaptureRequestBus::BroadcastResult(frameCaptureId, &AZ::Render::FrameCaptureRequestBus::Events::CaptureScreenshot, filePath);
+                if (frameCaptureId != AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId)
+                {
+                    s_instance->m_frameCaptureId = frameCaptureId;
+                }
             }
         };
 
@@ -1502,7 +1514,13 @@ namespace AtomSampleViewer
             // Note this will pause the script until the capture is complete
             if (PrepareForScreenCapture(filePath))
             {
-                AZ::Render::FrameCaptureRequestBus::Broadcast(&AZ::Render::FrameCaptureRequestBus::Events::CaptureScreenshotWithPreview, filePath);
+                AZ_Assert(s_instance->m_frameCaptureId == AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId, "Attempting to start a capture while one is in progress");
+                uint32_t frameCaptureId = AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId;
+                AZ::Render::FrameCaptureRequestBus::BroadcastResult(frameCaptureId, &AZ::Render::FrameCaptureRequestBus::Events::CaptureScreenshotWithPreview, filePath);
+                if (frameCaptureId != AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId)
+                {
+                    s_instance->m_frameCaptureId = frameCaptureId;
+                }
             }
         };
 
@@ -1593,7 +1611,13 @@ namespace AtomSampleViewer
             // Note this will pause the script until the capture is complete
             if (PrepareForScreenCapture(outputFilePath))
             {
-                AZ::Render::FrameCaptureRequestBus::Broadcast(&AZ::Render::FrameCaptureRequestBus::Events::CapturePassAttachment, passHierarchy, slot, outputFilePath, readbackOption);
+                AZ_Assert(s_instance->m_frameCaptureId == AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId, "Attempting to start a capture while one is in progress");
+                uint32_t frameCaptureId = AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId;
+                AZ::Render::FrameCaptureRequestBus::BroadcastResult(frameCaptureId, &AZ::Render::FrameCaptureRequestBus::Events::CapturePassAttachment, passHierarchy, slot, outputFilePath, readbackOption);
+                if (frameCaptureId != AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId)
+                {
+                    s_instance->m_frameCaptureId = frameCaptureId;
+                }
             }
         };
 
@@ -1604,9 +1628,15 @@ namespace AtomSampleViewer
             });
     }
 
-    void ScriptManager::OnCaptureFinished(AZ::Render::FrameCaptureResult result, const AZStd::string &info)
+    void ScriptManager::OnCaptureFinished(uint32_t frameCaptureId, AZ::Render::FrameCaptureResult result, const AZStd::string &info)
     {
+         // ignore captures that are not triggered by the script manager
+        if (m_frameCaptureId == AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId || frameCaptureId != m_frameCaptureId)
+        {
+            return;
+        }
         m_isCapturePending = false;
+        m_frameCaptureId = AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId;
         AZ::Render::FrameCaptureNotificationBus::Handler::BusDisconnect();
         ResumeScript();
 

+ 2 - 1
Gem/Code/Source/Automation/ScriptManager.h

@@ -217,7 +217,7 @@ namespace AtomSampleViewer
         void OnCameraMoveEnded(AZ::TypeId controllerTypeId, uint32_t channels) override;
 
         // FrameCaptureNotificationBus overrides...
-        void OnCaptureFinished(AZ::Render::FrameCaptureResult result, const AZStd::string& info) override;
+        void OnCaptureFinished(uint32_t frameCaptureId, AZ::Render::FrameCaptureResult result, const AZStd::string& info) override;
 
         // ProfilingCaptureNotificationBus overrides...
         void OnCaptureQueryTimestampFinished(bool result, const AZStd::string& info) override;
@@ -338,6 +338,7 @@ namespace AtomSampleViewer
         bool m_showPrecommitWizard = false;
         PrecommitWizardSettings m_wizardSettings;
 
+        uint32_t m_frameCaptureId = AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId;
         bool m_showScriptRunnerDialog = false;
         bool m_isCapturePending = false;
         bool m_frameTimeIsLocked = false;

+ 1 - 1
Gem/Code/Source/ReadbackExampleComponent.cpp

@@ -271,7 +271,7 @@ namespace AtomSampleViewer
             m_readback->SetCallback(AZStd::bind(&ReadbackExampleComponent::ReadbackCallback, this, AZStd::placeholders::_1));
         }
 
-        m_fillerPass->ReadbackAttachment(m_readback, AZ::Name("Output"));
+        m_fillerPass->ReadbackAttachment(m_readback, 0, AZ::Name("Output"));
     }
 
     void ReadbackExampleComponent::ReadbackCallback(const AZ::RPI::AttachmentReadback::ReadbackResult& result)

+ 12 - 3
Gem/Code/Source/SampleComponentManager.cpp

@@ -619,8 +619,11 @@ namespace AtomSampleViewer
             else if (m_countdownForFrameCapture == 0)
             {
                 AZ::Render::FrameCaptureNotificationBus::Handler::BusConnect();
-                AZ::Render::FrameCaptureRequestBus::Broadcast(&AZ::Render::FrameCaptureRequestBus::Events::CaptureScreenshot, m_frameCaptureFilePath);
-                m_countdownForFrameCapture = -1; // Don't call CaptureScreenshot again
+                AZ::Render::FrameCaptureRequestBus::BroadcastResult(m_frameCaptureId, &AZ::Render::FrameCaptureRequestBus::Events::CaptureScreenshot, m_frameCaptureFilePath);
+                if (m_frameCaptureId != AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId ) // if unsuccessfull leave state to attempt again next tick
+                {
+                    m_countdownForFrameCapture = -1; // Don't call CaptureScreenshot again
+                }
             }
         }
     }
@@ -1201,6 +1204,7 @@ namespace AtomSampleViewer
     void SampleComponentManager::RequestFrameCapture(const AZStd::string& filePath, bool hideImGui)
     {
         AZ_Assert(false == m_isFrameCapturePending, "Frame capture already in progress");
+        AZ_Assert(AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId == m_frameCaptureId, "Unfinished frame capture detected");
         m_isFrameCapturePending = true;
         m_hideImGuiDuringFrameCapture = hideImGui;
         m_frameCaptureFilePath = filePath;
@@ -1224,8 +1228,12 @@ namespace AtomSampleViewer
         }
     }
 
-    void SampleComponentManager::OnCaptureFinished(AZ::Render::FrameCaptureResult /*result*/, const AZStd::string& /*info*/)
+    void SampleComponentManager::OnCaptureFinished(uint32_t captureId, AZ::Render::FrameCaptureResult /*result*/, const AZStd::string& /*info*/)
     {
+        if (captureId != m_frameCaptureId) // ignore captures from other systems
+        {
+            return;
+        }
         AZ::Render::FrameCaptureNotificationBus::Handler::BusDisconnect();
 
         if (m_hideImGuiDuringFrameCapture)
@@ -1238,6 +1246,7 @@ namespace AtomSampleViewer
 
         ScriptRunnerRequestBus::Broadcast(&ScriptRunnerRequests::ResumeScript);
         m_isFrameCapturePending = false;
+        m_frameCaptureId = AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId;
     }
 
     bool SampleComponentManager::IsFrameCapturePending()

+ 2 - 1
Gem/Code/Source/SampleComponentManager.h

@@ -159,7 +159,7 @@ namespace AtomSampleViewer
         void ClearRPIScene() override;
 
         // FrameCaptureNotificationBus overrides...
-        void OnCaptureFinished(AZ::Render::FrameCaptureResult result, const AZStd::string& info) override;
+        void OnCaptureFinished(uint32_t frameCaptureId, AZ::Render::FrameCaptureResult result, const AZStd::string& info) override;
 
         // AzFramework::AssetCatalogEventBus::Handler overrides ...
         void OnCatalogLoaded(const char* catalogFile) override;
@@ -247,6 +247,7 @@ namespace AtomSampleViewer
         bool m_isFrameCapturePending = false;
         bool m_hideImGuiDuringFrameCapture = true;
         int m_countdownForFrameCapture = 0;
+        uint32_t m_frameCaptureId = AZ::Render::FrameCaptureRequests::s_InvalidFrameCaptureId;
         AZStd::string m_frameCaptureFilePath;
 
         AZStd::unique_ptr<ScriptManager> m_scriptManager;