refactor(srp): formalize renderer block recording

This commit is contained in:
2026-04-22 01:43:54 +08:00
parent 33e9041d60
commit 99eae1fe9f
6 changed files with 411 additions and 43 deletions

View File

@@ -10,6 +10,8 @@ namespace XCEngine.Rendering.Universal
new List<ScriptableRendererFeature>();
private readonly List<ScriptableRenderPass> m_activePassQueue =
new List<ScriptableRenderPass>();
private readonly RendererBlocks m_rendererBlocks =
new RendererBlocks();
private bool m_disposed;
protected ScriptableRenderer()
@@ -36,6 +38,7 @@ namespace XCEngine.Rendering.Universal
m_features.Clear();
m_activePassQueue.Clear();
m_rendererBlocks.Clear();
m_disposed = true;
}
@@ -130,17 +133,7 @@ namespace XCEngine.Rendering.Universal
RenderingData renderingData =
context.renderingData;
BuildPassQueue(renderingData);
for (int i = 0; i < m_activePassQueue.Count; ++i)
{
ScriptableRenderPass renderPass = m_activePassQueue[i];
if (renderPass != null &&
renderPass.SupportsStage(context.stage))
{
return true;
}
}
return false;
return SupportsRendererStage(context);
}
protected virtual bool RecordRenderer(
@@ -155,28 +148,7 @@ namespace XCEngine.Rendering.Universal
RenderingData renderingData =
context.renderingData;
BuildPassQueue(renderingData);
bool recordedAnyPass = false;
for (int i = 0; i < m_activePassQueue.Count; ++i)
{
ScriptableRenderPass renderPass = m_activePassQueue[i];
if (renderPass == null ||
!renderPass.SupportsStage(renderingData.stage))
{
continue;
}
if (!renderPass.Record(
context.renderContext,
renderingData))
{
return false;
}
recordedAnyPass = true;
}
return recordedAnyPass;
return RecordRendererStage(context);
}
protected internal virtual bool SupportsStageRenderGraph(
@@ -214,6 +186,147 @@ namespace XCEngine.Rendering.Universal
{
}
private bool HasRendererBlock(
RendererBlock block)
{
return m_rendererBlocks.HasPasses(block);
}
protected virtual bool SupportsRendererStage(
RendererRecordingContext context)
{
if (context == null)
{
return false;
}
switch (context.stage)
{
case CameraFrameStage.ShadowCaster:
return HasRendererBlock(
RendererBlock.ShadowCaster);
case CameraFrameStage.DepthOnly:
return HasRendererBlock(
RendererBlock.DepthPrepass);
case CameraFrameStage.MainScene:
return HasRendererBlock(
RendererBlock.MainOpaque) ||
HasRendererBlock(
RendererBlock.MainSkybox) ||
HasRendererBlock(
RendererBlock.MainTransparent);
case CameraFrameStage.PostProcess:
return HasRendererBlock(
RendererBlock.PostProcess);
case CameraFrameStage.FinalOutput:
return HasRendererBlock(
RendererBlock.FinalOutput);
default:
return false;
}
}
protected virtual bool RecordRendererStage(
RendererRecordingContext context)
{
if (context == null ||
context.renderContext == null)
{
return false;
}
bool recordedAnyPass = false;
switch (context.stage)
{
case CameraFrameStage.ShadowCaster:
return RecordRendererBlock(
RendererBlock.ShadowCaster,
context,
ref recordedAnyPass) &&
recordedAnyPass;
case CameraFrameStage.DepthOnly:
return RecordRendererBlock(
RendererBlock.DepthPrepass,
context,
ref recordedAnyPass) &&
recordedAnyPass;
case CameraFrameStage.MainScene:
return RecordRendererBlock(
RendererBlock.MainOpaque,
context,
ref recordedAnyPass) &&
RecordRendererBlock(
RendererBlock.MainSkybox,
context,
ref recordedAnyPass) &&
RecordRendererBlock(
RendererBlock.MainTransparent,
context,
ref recordedAnyPass) &&
recordedAnyPass;
case CameraFrameStage.PostProcess:
return RecordRendererBlock(
RendererBlock.PostProcess,
context,
ref recordedAnyPass) &&
recordedAnyPass;
case CameraFrameStage.FinalOutput:
return RecordRendererBlock(
RendererBlock.FinalOutput,
context,
ref recordedAnyPass) &&
recordedAnyPass;
default:
return false;
}
}
private bool RecordRendererBlock(
RendererBlock block,
RendererRecordingContext context,
ref bool recordedAnyPass)
{
if (context == null ||
context.renderContext == null)
{
return false;
}
int firstPassIndex;
int lastPassIndex;
if (!m_rendererBlocks.TryGetPassRange(
block,
out firstPassIndex,
out lastPassIndex))
{
return true;
}
for (int i = firstPassIndex;
i <= lastPassIndex;
++i)
{
ScriptableRenderPass renderPass =
m_activePassQueue[i];
if (renderPass == null ||
!renderPass.SupportsRendererBlock(block))
{
continue;
}
if (!renderPass.Record(
context.renderContext,
context.renderingData))
{
return false;
}
recordedAnyPass = true;
}
return true;
}
private void BuildPassQueue(
RenderingData renderingData)
{
@@ -233,6 +346,7 @@ namespace XCEngine.Rendering.Universal
}
AddRenderPasses(renderingData);
m_rendererBlocks.Build(m_activePassQueue);
}
protected virtual void ReleaseRuntimeResources()