Align rendering orchestration with camera stack plans

This commit is contained in:
2026-04-28 02:42:42 +08:00
parent be0d244372
commit 3bc0cfcf08
20 changed files with 616 additions and 13 deletions

View File

@@ -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()