Freeze URP renderer frame plans

This commit is contained in:
2026-04-27 23:12:36 +08:00
parent 45fede0b76
commit 87df14f47b
5 changed files with 342 additions and 61 deletions

View File

@@ -17,9 +17,9 @@ namespace XCEngine.Rendering.Universal
public bool finalOutput;
}
private sealed class PassQueueFrameSnapshot
private sealed class RendererFramePlan
{
public PassQueueFrameSnapshot(
public RendererFramePlan(
ulong framePlanId,
int rendererIndex,
List<ScriptableRenderPass> activePassQueue)
@@ -43,9 +43,9 @@ namespace XCEngine.Rendering.Universal
new List<ScriptableRenderPass>();
private readonly RendererBlocks m_rendererBlocks =
new RendererBlocks();
private readonly Dictionary<ulong, PassQueueFrameSnapshot>
m_framePlanSnapshots =
new Dictionary<ulong, PassQueueFrameSnapshot>();
private readonly Dictionary<ulong, RendererFramePlan>
m_framePlans =
new Dictionary<ulong, RendererFramePlan>();
private readonly CommandBuffer m_finishCameraStackCommandBuffer =
new CommandBuffer("ScriptableRenderer.FinishCameraStack");
private bool m_disposed;
@@ -75,7 +75,7 @@ namespace XCEngine.Rendering.Universal
m_features.Clear();
m_activePassQueue.Clear();
m_rendererBlocks.Clear();
m_framePlanSnapshots.Clear();
m_framePlans.Clear();
m_disposed = true;
}
@@ -151,10 +151,10 @@ namespace XCEngine.Rendering.Universal
return;
}
PassQueueFrameSnapshot snapshot =
BuildPassQueueFrameSnapshot(context);
ApplyPassQueueStageManifest(context, snapshot.manifest);
StorePassQueueFrameSnapshot(snapshot);
RendererFramePlan framePlan =
BuildRendererFramePlan(context);
ApplyPassQueueStageManifest(context, framePlan.manifest);
StoreRendererFramePlan(framePlan);
ClearPassQueue();
}
@@ -195,14 +195,14 @@ namespace XCEngine.Rendering.Universal
RenderingData renderingData =
context.renderingData;
PassQueueFrameSnapshot snapshot;
if (TryGetPassQueueFrameSnapshot(
RendererFramePlan framePlan;
if (TryGetRendererFramePlan(
context,
out snapshot))
out framePlan))
{
return SupportsRendererRecordingFromSnapshot(
return SupportsRendererRecordingFromFramePlan(
context,
snapshot);
framePlan);
}
if (context.framePlanId != 0UL)
@@ -232,14 +232,14 @@ namespace XCEngine.Rendering.Universal
RenderingData renderingData =
context.renderingData;
PassQueueFrameSnapshot snapshot;
if (TryGetPassQueueFrameSnapshot(
RendererFramePlan framePlan;
if (TryGetRendererFramePlan(
context,
out snapshot))
out framePlan))
{
return RecordRendererFromSnapshot(
return RecordRendererFromFramePlan(
context,
snapshot);
framePlan);
}
if (context.framePlanId != 0UL)
@@ -422,7 +422,7 @@ namespace XCEngine.Rendering.Universal
}
}
private PassQueueFrameSnapshot BuildPassQueueFrameSnapshot(
private RendererFramePlan BuildRendererFramePlan(
ScriptableRenderPipelinePlanningContext context)
{
bool finalColorRequiresProcessing =
@@ -436,18 +436,18 @@ namespace XCEngine.Rendering.Universal
finalColorRequiresProcessing,
framePlanId));
List<ScriptableRenderPass> activePassQueue =
new List<ScriptableRenderPass>(
SnapshotActivePassQueue(
m_activePassQueue);
RendererBlocks rendererBlocks =
new RendererBlocks();
rendererBlocks.Build(activePassQueue);
PassQueueFrameSnapshot snapshot =
new PassQueueFrameSnapshot(
RendererFramePlan framePlan =
new RendererFramePlan(
framePlanId,
rendererIndex,
activePassQueue);
snapshot.manifest = new PassQueueStageManifest
framePlan.manifest = new PassQueueStageManifest
{
shadowCaster = HasRendererStageBlocks(
CameraFrameStage.ShadowCaster,
@@ -463,7 +463,7 @@ namespace XCEngine.Rendering.Universal
rendererBlocks)
};
return snapshot;
return framePlan;
}
private static void ApplyPassQueueStageManifest(
@@ -716,24 +716,24 @@ namespace XCEngine.Rendering.Universal
return true;
}
private void StorePassQueueFrameSnapshot(
PassQueueFrameSnapshot snapshot)
private void StoreRendererFramePlan(
RendererFramePlan framePlan)
{
if (snapshot == null ||
snapshot.framePlanId == 0UL)
if (framePlan == null ||
framePlan.framePlanId == 0UL)
{
return;
}
if (!m_framePlanSnapshots.ContainsKey(
snapshot.framePlanId) &&
m_framePlanSnapshots.Count >=
if (!m_framePlans.ContainsKey(
framePlan.framePlanId) &&
m_framePlans.Count >=
kMaxFramePlanSnapshotCount)
{
ulong oldestFramePlanId = 0UL;
bool hasOldestFramePlanId = false;
foreach (ulong framePlanId in
m_framePlanSnapshots.Keys)
m_framePlans.Keys)
{
oldestFramePlanId = framePlanId;
hasOldestFramePlanId = true;
@@ -742,31 +742,31 @@ namespace XCEngine.Rendering.Universal
if (hasOldestFramePlanId)
{
m_framePlanSnapshots.Remove(
m_framePlans.Remove(
oldestFramePlanId);
}
}
m_framePlanSnapshots[snapshot.framePlanId] =
snapshot;
m_framePlans[framePlan.framePlanId] =
framePlan;
}
private bool TryGetPassQueueFrameSnapshot(
private bool TryGetRendererFramePlan(
RendererRecordingContext context,
out PassQueueFrameSnapshot frameSnapshot)
out RendererFramePlan framePlan)
{
frameSnapshot = null;
framePlan = null;
if (context == null ||
context.framePlanId == 0UL)
{
return false;
}
if (!m_framePlanSnapshots.TryGetValue(
if (!m_framePlans.TryGetValue(
context.framePlanId,
out frameSnapshot) ||
frameSnapshot == null ||
frameSnapshot.rendererIndex !=
out framePlan) ||
framePlan == null ||
framePlan.rendererIndex !=
context.rendererIndex)
{
return false;
@@ -775,11 +775,11 @@ namespace XCEngine.Rendering.Universal
return true;
}
private bool SupportsRendererRecordingFromSnapshot(
private bool SupportsRendererRecordingFromFramePlan(
RendererRecordingContext context,
PassQueueFrameSnapshot snapshot)
RendererFramePlan framePlan)
{
LoadPassQueueFrameSnapshot(snapshot);
LoadRendererFramePlan(framePlan);
try
{
return SupportsRendererStage(context);
@@ -790,11 +790,11 @@ namespace XCEngine.Rendering.Universal
}
}
private bool RecordRendererFromSnapshot(
private bool RecordRendererFromFramePlan(
RendererRecordingContext context,
PassQueueFrameSnapshot snapshot)
RendererFramePlan framePlan)
{
LoadPassQueueFrameSnapshot(snapshot);
LoadRendererFramePlan(framePlan);
try
{
bool recorded;
@@ -821,21 +821,47 @@ namespace XCEngine.Rendering.Universal
}
}
private void LoadPassQueueFrameSnapshot(
PassQueueFrameSnapshot snapshot)
private void LoadRendererFramePlan(
RendererFramePlan framePlan)
{
ClearPassQueue();
if (snapshot == null ||
snapshot.activePassQueue == null)
if (framePlan == null ||
framePlan.activePassQueue == null)
{
return;
}
m_activePassQueue.AddRange(
snapshot.activePassQueue);
framePlan.activePassQueue);
m_rendererBlocks.Build(m_activePassQueue);
}
private static List<ScriptableRenderPass> SnapshotActivePassQueue(
IList<ScriptableRenderPass> activePassQueue)
{
List<ScriptableRenderPass> snapshot =
new List<ScriptableRenderPass>();
if (activePassQueue == null)
{
return snapshot;
}
for (int i = 0; i < activePassQueue.Count; ++i)
{
ScriptableRenderPass renderPass =
activePassQueue[i];
if (renderPass == null)
{
continue;
}
snapshot.Add(
renderPass.CreateFramePlanSnapshot());
}
return snapshot;
}
private void BuildPassQueue(
RenderingData renderingData)
{