Freeze URP renderer frame plans
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user