Align rendering orchestration with camera stack plans
This commit is contained in:
@@ -46,6 +46,12 @@ namespace XCEngine.Rendering.Universal
|
||||
private readonly Dictionary<ulong, RendererFramePlan>
|
||||
m_framePlans =
|
||||
new Dictionary<ulong, RendererFramePlan>();
|
||||
private readonly List<ScriptableRenderPass>
|
||||
m_pendingCameraStackFinishPasses =
|
||||
new List<ScriptableRenderPass>();
|
||||
private readonly List<ulong>
|
||||
m_pendingCameraStackFinishFramePlans =
|
||||
new List<ulong>();
|
||||
private readonly CommandBuffer m_finishCameraStackCommandBuffer =
|
||||
new CommandBuffer("ScriptableRenderer.FinishCameraStack");
|
||||
private bool m_disposed;
|
||||
@@ -76,6 +82,8 @@ namespace XCEngine.Rendering.Universal
|
||||
m_activePassQueue.Clear();
|
||||
m_rendererBlocks.Clear();
|
||||
m_framePlans.Clear();
|
||||
m_pendingCameraStackFinishPasses.Clear();
|
||||
m_pendingCameraStackFinishFramePlans.Clear();
|
||||
m_disposed = true;
|
||||
}
|
||||
|
||||
@@ -185,6 +193,12 @@ namespace XCEngine.Rendering.Universal
|
||||
return RecordRenderer(context);
|
||||
}
|
||||
|
||||
internal void FinishCameraStackRenderingInstance(
|
||||
RendererRecordingContext context)
|
||||
{
|
||||
FinishCameraStackRendering(context);
|
||||
}
|
||||
|
||||
protected virtual bool SupportsRendererRecording(
|
||||
RendererRecordingContext context)
|
||||
{
|
||||
@@ -267,7 +281,10 @@ namespace XCEngine.Rendering.Universal
|
||||
}
|
||||
if (recorded)
|
||||
{
|
||||
FinishCameraStackRendering();
|
||||
QueueCameraStackFinish(
|
||||
m_activePassQueue,
|
||||
0UL);
|
||||
FinishCameraStackRendering(null);
|
||||
}
|
||||
|
||||
return recorded;
|
||||
@@ -814,7 +831,7 @@ namespace XCEngine.Rendering.Universal
|
||||
}
|
||||
if (recorded)
|
||||
{
|
||||
FinishCameraStackRendering();
|
||||
QueueCameraStackFinish(framePlan);
|
||||
}
|
||||
|
||||
return recorded;
|
||||
@@ -897,12 +914,71 @@ namespace XCEngine.Rendering.Universal
|
||||
m_rendererBlocks.Clear();
|
||||
}
|
||||
|
||||
private void FinishCameraStackRendering()
|
||||
private void QueueCameraStackFinish(
|
||||
RendererFramePlan framePlan)
|
||||
{
|
||||
for (int i = 0; i < m_activePassQueue.Count; ++i)
|
||||
if (framePlan == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
QueueCameraStackFinish(
|
||||
framePlan.activePassQueue,
|
||||
framePlan.framePlanId);
|
||||
}
|
||||
|
||||
private void QueueCameraStackFinish(
|
||||
IList<ScriptableRenderPass> renderPasses,
|
||||
ulong framePlanId)
|
||||
{
|
||||
if (renderPasses == null ||
|
||||
renderPasses.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (framePlanId != 0UL &&
|
||||
m_pendingCameraStackFinishFramePlans.Contains(
|
||||
framePlanId))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (framePlanId != 0UL)
|
||||
{
|
||||
m_pendingCameraStackFinishFramePlans.Add(
|
||||
framePlanId);
|
||||
}
|
||||
|
||||
for (int i = 0; i < renderPasses.Count; ++i)
|
||||
{
|
||||
ScriptableRenderPass renderPass =
|
||||
m_activePassQueue[i];
|
||||
renderPasses[i];
|
||||
if (renderPass != null)
|
||||
{
|
||||
m_pendingCameraStackFinishPasses.Add(
|
||||
renderPass);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void FinishCameraStackRendering(
|
||||
RendererRecordingContext context)
|
||||
{
|
||||
if (context != null &&
|
||||
context.framePlanId != 0UL &&
|
||||
!m_pendingCameraStackFinishFramePlans.Contains(
|
||||
context.framePlanId))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0;
|
||||
i < m_pendingCameraStackFinishPasses.Count;
|
||||
++i)
|
||||
{
|
||||
ScriptableRenderPass renderPass =
|
||||
m_pendingCameraStackFinishPasses[i];
|
||||
if (renderPass == null)
|
||||
{
|
||||
continue;
|
||||
@@ -911,6 +987,9 @@ namespace XCEngine.Rendering.Universal
|
||||
renderPass.OnFinishCameraStackRendering(
|
||||
m_finishCameraStackCommandBuffer);
|
||||
}
|
||||
|
||||
m_pendingCameraStackFinishPasses.Clear();
|
||||
m_pendingCameraStackFinishFramePlans.Clear();
|
||||
}
|
||||
|
||||
protected virtual void ReleaseRuntimeResources()
|
||||
|
||||
Reference in New Issue
Block a user