refactor(srp): formalize renderer block recording
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user