Revert "Refresh rate driven rendering tick logic (#3375)"
This reverts commit db63dcbcd9.
Signed-off-by: nvsickle <nvsickle@amazon.com>
This commit is contained in:
@@ -14,9 +14,6 @@
|
||||
#include <RPI.Private/RPISystemComponent.h>
|
||||
|
||||
#include <Atom/RHI/Factory.h>
|
||||
#include <Atom/RPI.Public/ViewportContextBus.h>
|
||||
#include <Atom/RPI.Public/ViewportContext.h>
|
||||
#include <Atom/RPI.Public/RenderPipeline.h>
|
||||
|
||||
#include <AzCore/Asset/AssetManager.h>
|
||||
#include <AzCore/IO/IOUtils.h>
|
||||
@@ -96,29 +93,20 @@ namespace AZ
|
||||
}
|
||||
|
||||
m_rpiSystem.Initialize(m_rpiDescriptor);
|
||||
AZ::TickBus::Handler::BusConnect();
|
||||
AZ::SystemTickBus::Handler::BusConnect();
|
||||
}
|
||||
|
||||
void RPISystemComponent::Deactivate()
|
||||
{
|
||||
AZ::TickBus::Handler::BusDisconnect();
|
||||
AZ::SystemTickBus::Handler::BusDisconnect();
|
||||
m_rpiSystem.Shutdown();
|
||||
}
|
||||
|
||||
void RPISystemComponent::OnTick([[maybe_unused]]float deltaTime, [[maybe_unused]]ScriptTimePoint time)
|
||||
void RPISystemComponent::OnSystemTick()
|
||||
{
|
||||
if (deltaTime == 0.f)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_rpiSystem.SimulationTick();
|
||||
m_rpiSystem.RenderTick();
|
||||
}
|
||||
|
||||
int RPISystemComponent::GetTickOrder()
|
||||
{
|
||||
return AZ::ComponentTickBus::TICK_RENDER;
|
||||
}
|
||||
} // namespace RPI
|
||||
} // namespace AZ
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace AZ
|
||||
*/
|
||||
class RPISystemComponent final
|
||||
: public AZ::Component
|
||||
, private AZ::TickBus::Handler
|
||||
, public AZ::SystemTickBus::Handler
|
||||
{
|
||||
public:
|
||||
AZ_COMPONENT(RPISystemComponent, "{83E301F3-7A0C-4099-B530-9342B91B1BC0}");
|
||||
@@ -50,9 +50,8 @@ namespace AZ
|
||||
private:
|
||||
RPISystemComponent(const RPISystemComponent&) = delete;
|
||||
|
||||
// TickBus overrides...
|
||||
void OnTick(float deltaTime, ScriptTimePoint time) override;
|
||||
int GetTickOrder() override;
|
||||
// SystemTickBus overrides...
|
||||
void OnSystemTick() override;
|
||||
|
||||
RPISystem m_rpiSystem;
|
||||
|
||||
|
||||
@@ -93,11 +93,8 @@ namespace AZ
|
||||
|
||||
void Pass::SetEnabled(bool enabled)
|
||||
{
|
||||
if (m_flags.m_enabled != enabled)
|
||||
{
|
||||
m_flags.m_enabled = enabled;
|
||||
OnHierarchyChange();
|
||||
}
|
||||
m_flags.m_enabled = enabled;
|
||||
OnHierarchyChange();
|
||||
}
|
||||
|
||||
bool Pass::IsEnabled() const
|
||||
|
||||
@@ -301,26 +301,6 @@ namespace AZ
|
||||
m_drawFilterMask = 0;
|
||||
}
|
||||
|
||||
void RenderPipeline::OnPrepareFrame()
|
||||
{
|
||||
m_lastRenderRequestTime = AZStd::chrono::system_clock::now();
|
||||
|
||||
// If we're attempting to render at a target interval, check to see if we're within
|
||||
// 1ms of that interval, enabling rendering only if we are.
|
||||
if (m_renderMode == RenderMode::RenderAtTargetRate)
|
||||
{
|
||||
constexpr AZStd::chrono::duration<float> updateThresholdMs(0.001f);
|
||||
const bool shouldRender =
|
||||
m_lastRenderRequestTime - m_lastRenderStartTime + updateThresholdMs >= m_targetRefreshRate;
|
||||
m_rootPass->SetEnabled(shouldRender);
|
||||
}
|
||||
|
||||
if (NeedsRender())
|
||||
{
|
||||
m_prepareFrameEvent.Signal();
|
||||
}
|
||||
}
|
||||
|
||||
void RenderPipeline::OnPassModified()
|
||||
{
|
||||
if (m_needsPassRecreate)
|
||||
@@ -395,11 +375,11 @@ namespace AZ
|
||||
m_scene->RemoveRenderPipeline(m_nameId);
|
||||
}
|
||||
|
||||
void RenderPipeline::OnStartFrame()
|
||||
void RenderPipeline::OnStartFrame(const TickTimeInfo& tick)
|
||||
{
|
||||
AZ_PROFILE_SCOPE(RPI, "RenderPipeline: OnStartFrame");
|
||||
|
||||
m_lastRenderStartTime = m_lastRenderRequestTime;
|
||||
m_lastRenderStartTime = tick.m_currentGameTime;
|
||||
|
||||
OnPassModified();
|
||||
|
||||
@@ -427,7 +407,6 @@ namespace AZ
|
||||
{
|
||||
RemoveFromRenderTick();
|
||||
}
|
||||
m_endFrameEvent.Signal();
|
||||
}
|
||||
|
||||
void RenderPipeline::CollectPersistentViews(AZStd::map<ViewPtr, RHI::DrawListMask>& outViewMasks) const
|
||||
@@ -510,13 +489,6 @@ namespace AZ
|
||||
m_renderMode = RenderMode::RenderEveryTick;
|
||||
}
|
||||
|
||||
void RenderPipeline::AddToRenderTickAtInterval(AZStd::chrono::duration<float> renderInterval)
|
||||
{
|
||||
m_rootPass->SetEnabled(false);
|
||||
m_renderMode = RenderMode::RenderAtTargetRate;
|
||||
m_targetRefreshRate = renderInterval;
|
||||
}
|
||||
|
||||
void RenderPipeline::RemoveFromRenderTick()
|
||||
{
|
||||
m_renderMode = RenderMode::NoRender;
|
||||
@@ -530,7 +502,7 @@ namespace AZ
|
||||
|
||||
bool RenderPipeline::NeedsRender() const
|
||||
{
|
||||
return m_rootPass->IsEnabled();
|
||||
return m_renderMode != RenderMode::NoRender;
|
||||
}
|
||||
|
||||
RHI::DrawFilterTag RenderPipeline::GetDrawFilterTag() const
|
||||
@@ -543,16 +515,6 @@ namespace AZ
|
||||
return m_drawFilterMask;
|
||||
}
|
||||
|
||||
void RenderPipeline::ConnectPrepareFrameHandler(FrameNotificationEvent::Handler& handler)
|
||||
{
|
||||
handler.Connect(m_prepareFrameEvent);
|
||||
}
|
||||
|
||||
void RenderPipeline::ConnectEndFrameHandler(FrameNotificationEvent::Handler& handler)
|
||||
{
|
||||
handler.Connect(m_endFrameEvent);
|
||||
}
|
||||
|
||||
void RenderPipeline::SetDrawFilterTag(RHI::DrawFilterTag tag)
|
||||
{
|
||||
m_drawFilterTag = tag;
|
||||
|
||||
@@ -420,7 +420,7 @@ namespace AZ
|
||||
}
|
||||
}
|
||||
|
||||
void Scene::PrepareRender([[maybe_unused]]const TickTimeInfo& tickInfo, RHI::JobPolicy jobPolicy)
|
||||
void Scene::PrepareRender(const TickTimeInfo& tickInfo, RHI::JobPolicy jobPolicy)
|
||||
{
|
||||
AZ_PROFILE_SCOPE(RPI, "Scene: PrepareRender");
|
||||
|
||||
@@ -431,27 +431,20 @@ namespace AZ
|
||||
|
||||
SceneNotificationBus::Event(GetId(), &SceneNotification::OnBeginPrepareRender);
|
||||
|
||||
// Get active pipelines which need to be rendered and notify them of an impending frame.
|
||||
// Get active pipelines which need to be rendered and notify them frame started
|
||||
AZStd::vector<RenderPipelinePtr> activePipelines;
|
||||
{
|
||||
AZ_PROFILE_SCOPE(RPI, "Scene: OnPrepareFrame");
|
||||
AZ_PROFILE_SCOPE(RPI, "Scene: OnStartFrame");
|
||||
for (auto& pipeline : m_pipelines)
|
||||
{
|
||||
pipeline->OnPrepareFrame();
|
||||
if (pipeline->NeedsRender())
|
||||
{
|
||||
activePipelines.push_back(pipeline);
|
||||
pipeline->OnStartFrame(tickInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Get active pipelines which need to be rendered and notify them frame started
|
||||
for (const auto& pipeline : activePipelines)
|
||||
{
|
||||
AZ_PROFILE_SCOPE(RPI, "Scene: OnStartFrame");
|
||||
pipeline->OnStartFrame();
|
||||
}
|
||||
|
||||
// Return if there is no active render pipeline
|
||||
if (activePipelines.empty())
|
||||
{
|
||||
@@ -591,12 +584,10 @@ namespace AZ
|
||||
void Scene::OnFrameEnd()
|
||||
{
|
||||
AZ_PROFILE_SCOPE(RPI, "Scene: OnFrameEnd");
|
||||
bool didRender = false;
|
||||
for (auto& pipeline : m_pipelines)
|
||||
{
|
||||
if (pipeline->NeedsRender())
|
||||
{
|
||||
didRender = true;
|
||||
pipeline->OnFrameEnd();
|
||||
}
|
||||
}
|
||||
@@ -604,10 +595,6 @@ namespace AZ
|
||||
{
|
||||
fp->OnRenderEnd();
|
||||
}
|
||||
if (didRender)
|
||||
{
|
||||
SceneNotificationBus::Event(GetId(), &SceneNotification::OnFrameEnd);
|
||||
}
|
||||
}
|
||||
|
||||
void Scene::UpdateSrgs()
|
||||
|
||||
@@ -241,10 +241,7 @@ namespace AZ
|
||||
{
|
||||
AZ_PROFILE_SCOPE(RPI, "View: FinalizeDrawLists");
|
||||
m_drawListContext.FinalizeLists();
|
||||
if (m_passesByDrawList)
|
||||
{
|
||||
SortFinalizedDrawLists();
|
||||
}
|
||||
SortFinalizedDrawLists();
|
||||
}
|
||||
|
||||
void View::SortFinalizedDrawLists()
|
||||
|
||||
@@ -25,13 +25,14 @@ namespace AZ
|
||||
, m_viewportSize(1, 1)
|
||||
{
|
||||
m_windowContext->Initialize(device, nativeWindow);
|
||||
AzFramework::WindowRequestBus::Event(nativeWindow, [this](AzFramework::WindowRequestBus::Events* window)
|
||||
{
|
||||
m_viewportSize = window->GetClientAreaSize();
|
||||
m_viewportDpiScaleFactor = window->GetDpiScaleFactor();
|
||||
m_vsyncInterval = window->GetSyncInterval();
|
||||
m_refreshRate = window->GetDisplayRefreshRate();
|
||||
});
|
||||
AzFramework::WindowRequestBus::EventResult(
|
||||
m_viewportSize,
|
||||
nativeWindow,
|
||||
&AzFramework::WindowRequestBus::Events::GetClientAreaSize);
|
||||
AzFramework::WindowRequestBus::EventResult(
|
||||
m_viewportDpiScaleFactor,
|
||||
nativeWindow,
|
||||
&AzFramework::WindowRequestBus::Events::GetDpiScaleFactor);
|
||||
AzFramework::WindowNotificationBus::Handler::BusConnect(nativeWindow);
|
||||
AzFramework::ViewportRequestBus::Handler::BusConnect(id);
|
||||
|
||||
@@ -45,20 +46,6 @@ namespace AZ
|
||||
m_viewMatrixChangedEvent.Signal(matrix);
|
||||
});
|
||||
|
||||
m_prepareFrameHandler = RenderPipeline::FrameNotificationEvent::Handler(
|
||||
[this]()
|
||||
{
|
||||
ViewportContextNotificationBus::Event(GetName(), &ViewportContextNotificationBus::Events::OnRenderTick);
|
||||
ViewportContextIdNotificationBus::Event(GetId(), &ViewportContextIdNotificationBus::Events::OnRenderTick);
|
||||
});
|
||||
|
||||
m_endFrameHandler = RenderPipeline::FrameNotificationEvent::Handler(
|
||||
[this]()
|
||||
{
|
||||
ViewportContextNotificationBus::Event(GetName(), &ViewportContextNotificationBus::Events::OnFrameEnd);
|
||||
ViewportContextIdNotificationBus::Event(GetId(), &ViewportContextIdNotificationBus::Events::OnFrameEnd);
|
||||
});
|
||||
|
||||
SetRenderScene(renderScene);
|
||||
}
|
||||
|
||||
@@ -124,38 +111,26 @@ namespace AZ
|
||||
{
|
||||
SceneNotificationBus::Handler::BusConnect(m_rootScene->GetId());
|
||||
}
|
||||
ResetCurrentPipeline();
|
||||
m_currentPipeline.reset();
|
||||
UpdatePipelineView();
|
||||
UpdatePipelineRefreshRate();
|
||||
}
|
||||
|
||||
m_sceneChangedEvent.Signal(scene);
|
||||
}
|
||||
|
||||
float ViewportContext::GetFpsLimit() const
|
||||
void ViewportContext::RenderTick()
|
||||
{
|
||||
return m_fpsLimit;
|
||||
}
|
||||
|
||||
void ViewportContext::SetFpsLimit(float fpsLimit)
|
||||
{
|
||||
m_fpsLimit = fpsLimit;
|
||||
UpdatePipelineRefreshRate();
|
||||
}
|
||||
|
||||
float ViewportContext::GetTargetFrameRate() const
|
||||
{
|
||||
float targetFrameRate = GetFpsLimit();
|
||||
const AZ::u32 vsyncInterval = GetVsyncInterval();
|
||||
if (vsyncInterval != 0)
|
||||
// add the current pipeline to next render tick if it's not already added.
|
||||
if (m_currentPipeline && m_currentPipeline->GetRenderMode() != RenderPipeline::RenderMode::RenderOnce)
|
||||
{
|
||||
const float vsyncFrameRate = static_cast<float>(GetRefreshRate()) / static_cast<float>(vsyncInterval);
|
||||
if (targetFrameRate == 0.f || vsyncFrameRate < targetFrameRate)
|
||||
{
|
||||
targetFrameRate = vsyncFrameRate;
|
||||
}
|
||||
m_currentPipeline->AddToRenderTickOnce();
|
||||
}
|
||||
return targetFrameRate;
|
||||
}
|
||||
|
||||
void ViewportContext::OnBeginPrepareRender()
|
||||
{
|
||||
ViewportContextNotificationBus::Event(GetName(), &ViewportContextNotificationBus::Events::OnRenderTick);
|
||||
ViewportContextIdNotificationBus::Event(GetId(), &ViewportContextIdNotificationBus::Events::OnRenderTick);
|
||||
}
|
||||
|
||||
AZ::Name ViewportContext::GetName() const
|
||||
@@ -183,16 +158,6 @@ namespace AZ
|
||||
return m_viewportDpiScaleFactor;
|
||||
}
|
||||
|
||||
uint32_t ViewportContext::GetVsyncInterval() const
|
||||
{
|
||||
return m_vsyncInterval;
|
||||
}
|
||||
|
||||
uint32_t ViewportContext::GetRefreshRate() const
|
||||
{
|
||||
return m_refreshRate;
|
||||
}
|
||||
|
||||
void ViewportContext::ConnectSizeChangedHandler(SizeChangedEvent::Handler& handler)
|
||||
{
|
||||
handler.Connect(m_sizeChangedEvent);
|
||||
@@ -203,16 +168,6 @@ namespace AZ
|
||||
handler.Connect(m_dpiScalingFactorChangedEvent);
|
||||
}
|
||||
|
||||
void ViewportContext::ConnectVsyncIntervalChangedHandler(UintChangedEvent::Handler& handler)
|
||||
{
|
||||
handler.Connect(m_vsyncIntervalChangedEvent);
|
||||
}
|
||||
|
||||
void ViewportContext::ConnectRefreshRateChangedHandler(UintChangedEvent::Handler& handler)
|
||||
{
|
||||
handler.Connect(m_refreshRateChangedEvent);
|
||||
}
|
||||
|
||||
void ViewportContext::ConnectViewMatrixChangedHandler(MatrixChangedEvent::Handler& handler)
|
||||
{
|
||||
handler.Connect(m_viewMatrixChangedEvent);
|
||||
@@ -308,43 +263,12 @@ namespace AZ
|
||||
m_currentPipelineChangedEvent.Signal(m_currentPipeline);
|
||||
}
|
||||
|
||||
if (m_currentPipeline)
|
||||
if (auto pipeline = GetCurrentPipeline())
|
||||
{
|
||||
if (!m_prepareFrameHandler.IsConnected())
|
||||
{
|
||||
m_currentPipeline->ConnectPrepareFrameHandler(m_prepareFrameHandler);
|
||||
m_currentPipeline->ConnectEndFrameHandler(m_endFrameHandler);
|
||||
}
|
||||
m_currentPipeline->SetDefaultView(m_defaultView);
|
||||
pipeline->SetDefaultView(m_defaultView);
|
||||
}
|
||||
}
|
||||
|
||||
void ViewportContext::UpdatePipelineRefreshRate()
|
||||
{
|
||||
if (!m_currentPipeline)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const float refreshRate = GetTargetFrameRate();
|
||||
// If we have a truly unlimited framerate, just render every tick
|
||||
if (refreshRate == 0.f)
|
||||
{
|
||||
m_currentPipeline->AddToRenderTick();
|
||||
}
|
||||
else
|
||||
{
|
||||
m_currentPipeline->AddToRenderTickAtInterval(AZStd::chrono::duration<float>(1.f / refreshRate));
|
||||
}
|
||||
}
|
||||
|
||||
void ViewportContext::ResetCurrentPipeline()
|
||||
{
|
||||
m_prepareFrameHandler.Disconnect();
|
||||
m_endFrameHandler.Disconnect();
|
||||
m_currentPipeline.reset();
|
||||
}
|
||||
|
||||
RenderPipelinePtr ViewportContext::GetCurrentPipeline()
|
||||
{
|
||||
return m_currentPipeline;
|
||||
@@ -357,9 +281,8 @@ namespace AZ
|
||||
// in the event prioritization is added later
|
||||
if (pipeline->GetWindowHandle() == m_windowContext->GetWindowHandle())
|
||||
{
|
||||
ResetCurrentPipeline();
|
||||
m_currentPipeline.reset();
|
||||
UpdatePipelineView();
|
||||
UpdatePipelineRefreshRate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -367,9 +290,8 @@ namespace AZ
|
||||
{
|
||||
if (m_currentPipeline.get() == pipeline)
|
||||
{
|
||||
ResetCurrentPipeline();
|
||||
m_currentPipeline.reset();
|
||||
UpdatePipelineView();
|
||||
UpdatePipelineRefreshRate();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -383,30 +305,10 @@ namespace AZ
|
||||
}
|
||||
}
|
||||
|
||||
void ViewportContext::OnRefreshRateChanged(uint32_t refreshRate)
|
||||
{
|
||||
if (m_refreshRate != refreshRate)
|
||||
{
|
||||
m_refreshRate = refreshRate;
|
||||
m_refreshRateChangedEvent.Signal(m_refreshRate);
|
||||
UpdatePipelineRefreshRate();
|
||||
}
|
||||
}
|
||||
|
||||
void ViewportContext::OnDpiScaleFactorChanged(float dpiScaleFactor)
|
||||
{
|
||||
m_viewportDpiScaleFactor = dpiScaleFactor;
|
||||
m_dpiScalingFactorChangedEvent.Signal(dpiScaleFactor);
|
||||
}
|
||||
|
||||
void ViewportContext::OnVsyncIntervalChanged(uint32_t interval)
|
||||
{
|
||||
if (m_vsyncInterval != interval)
|
||||
{
|
||||
m_vsyncInterval = interval;
|
||||
m_vsyncIntervalChangedEvent.Signal(m_vsyncInterval);
|
||||
UpdatePipelineRefreshRate();
|
||||
}
|
||||
}
|
||||
} // namespace RPI
|
||||
} // namespace AZ
|
||||
|
||||
Reference in New Issue
Block a user