refactor(srp): formalize universal renderer selection and caching
This commit is contained in:
@@ -7,6 +7,7 @@ namespace XCEngine.Rendering.Universal
|
||||
public abstract class ScriptableRendererData : Object
|
||||
{
|
||||
private ScriptableRendererFeature[] m_rendererFeatures;
|
||||
private ScriptableRenderer m_rendererInstance;
|
||||
|
||||
protected ScriptableRendererData()
|
||||
{
|
||||
@@ -14,7 +15,17 @@ namespace XCEngine.Rendering.Universal
|
||||
|
||||
internal ScriptableRenderer CreateRendererInstance()
|
||||
{
|
||||
return CreateRenderer();
|
||||
return GetRendererInstance();
|
||||
}
|
||||
|
||||
internal ScriptableRenderer GetRendererInstance()
|
||||
{
|
||||
if (m_rendererInstance == null)
|
||||
{
|
||||
m_rendererInstance = CreateRenderer();
|
||||
}
|
||||
|
||||
return m_rendererInstance;
|
||||
}
|
||||
|
||||
internal ScriptableRendererFeature[] CreateRendererFeaturesInstance()
|
||||
|
||||
@@ -6,19 +6,18 @@ namespace XCEngine.Rendering.Universal
|
||||
internal sealed class UniversalRenderPipeline
|
||||
: ScriptableRenderPipeline
|
||||
{
|
||||
private readonly ScriptableRendererData m_rendererData;
|
||||
private ScriptableRenderer m_renderer;
|
||||
private readonly UniversalRenderPipelineAsset m_asset;
|
||||
|
||||
public UniversalRenderPipeline(
|
||||
ScriptableRendererData rendererData)
|
||||
UniversalRenderPipelineAsset asset)
|
||||
{
|
||||
m_rendererData = rendererData;
|
||||
m_asset = asset;
|
||||
}
|
||||
|
||||
protected override bool SupportsStageRenderGraph(
|
||||
CameraFrameStage stage)
|
||||
{
|
||||
ScriptableRenderer renderer = GetOrCreateRenderer();
|
||||
ScriptableRenderer renderer = GetDefaultRenderer();
|
||||
return renderer != null &&
|
||||
renderer.SupportsStageRenderGraph(stage);
|
||||
}
|
||||
@@ -26,21 +25,16 @@ namespace XCEngine.Rendering.Universal
|
||||
protected override bool RecordStageRenderGraph(
|
||||
ScriptableRenderContext context)
|
||||
{
|
||||
ScriptableRenderer renderer = GetOrCreateRenderer();
|
||||
ScriptableRenderer renderer = GetDefaultRenderer();
|
||||
return renderer != null &&
|
||||
renderer.RecordStageRenderGraph(context);
|
||||
}
|
||||
|
||||
private ScriptableRenderer GetOrCreateRenderer()
|
||||
private ScriptableRenderer GetDefaultRenderer()
|
||||
{
|
||||
if (m_renderer == null &&
|
||||
m_rendererData != null)
|
||||
{
|
||||
m_renderer =
|
||||
m_rendererData.CreateRendererInstance();
|
||||
}
|
||||
|
||||
return m_renderer;
|
||||
return m_asset != null
|
||||
? m_asset.GetDefaultRenderer()
|
||||
: null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,10 +15,8 @@ namespace XCEngine.Rendering.Universal
|
||||
|
||||
protected override ScriptableRenderPipeline CreatePipeline()
|
||||
{
|
||||
ScriptableRendererData resolvedRendererData =
|
||||
ResolveDefaultRendererData();
|
||||
return resolvedRendererData != null
|
||||
? new UniversalRenderPipeline(resolvedRendererData)
|
||||
return GetDefaultRendererData() != null
|
||||
? new UniversalRenderPipeline(this)
|
||||
: null;
|
||||
}
|
||||
|
||||
@@ -26,7 +24,7 @@ namespace XCEngine.Rendering.Universal
|
||||
CameraRenderRequestContext context)
|
||||
{
|
||||
ScriptableRendererData resolvedRendererData =
|
||||
ResolveDefaultRendererData();
|
||||
GetDefaultRendererData();
|
||||
if (resolvedRendererData != null)
|
||||
{
|
||||
resolvedRendererData.ConfigureCameraRenderRequestInstance(
|
||||
@@ -37,38 +35,86 @@ namespace XCEngine.Rendering.Universal
|
||||
protected override string GetPipelineRendererAssetKey()
|
||||
{
|
||||
ScriptableRendererData resolvedRendererData =
|
||||
ResolveDefaultRendererData();
|
||||
GetDefaultRendererData();
|
||||
return resolvedRendererData != null
|
||||
? resolvedRendererData.GetPipelineRendererAssetKeyInstance()
|
||||
: string.Empty;
|
||||
}
|
||||
|
||||
private ScriptableRendererData ResolveDefaultRendererData()
|
||||
internal ScriptableRendererData GetDefaultRendererData()
|
||||
{
|
||||
if (rendererDataList == null ||
|
||||
rendererDataList.Length == 0)
|
||||
return GetRendererData(defaultRendererIndex);
|
||||
}
|
||||
|
||||
internal ScriptableRenderer GetDefaultRenderer()
|
||||
{
|
||||
return GetRenderer(defaultRendererIndex);
|
||||
}
|
||||
|
||||
internal ScriptableRendererData GetRendererData(
|
||||
int rendererIndex)
|
||||
{
|
||||
EnsureRendererDataList();
|
||||
int resolvedRendererIndex =
|
||||
ResolveRendererIndex(rendererIndex);
|
||||
if (rendererDataList[resolvedRendererIndex] == null)
|
||||
{
|
||||
rendererDataList =
|
||||
new ScriptableRendererData[]
|
||||
{
|
||||
new UniversalRendererData()
|
||||
};
|
||||
defaultRendererIndex = 0;
|
||||
rendererDataList[resolvedRendererIndex] =
|
||||
new UniversalRendererData();
|
||||
}
|
||||
|
||||
return rendererDataList[resolvedRendererIndex];
|
||||
}
|
||||
|
||||
internal ScriptableRenderer GetRenderer(
|
||||
int rendererIndex)
|
||||
{
|
||||
ScriptableRendererData rendererData =
|
||||
GetRendererData(rendererIndex);
|
||||
return rendererData != null
|
||||
? rendererData.GetRendererInstance()
|
||||
: null;
|
||||
}
|
||||
|
||||
private void EnsureRendererDataList()
|
||||
{
|
||||
if (rendererDataList != null &&
|
||||
rendererDataList.Length > 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
rendererDataList =
|
||||
new ScriptableRendererData[]
|
||||
{
|
||||
new UniversalRendererData()
|
||||
};
|
||||
defaultRendererIndex = 0;
|
||||
}
|
||||
|
||||
private int ResolveRendererIndex(
|
||||
int rendererIndex)
|
||||
{
|
||||
EnsureRendererDataList();
|
||||
if (rendererIndex < 0 ||
|
||||
rendererIndex >= rendererDataList.Length)
|
||||
{
|
||||
return ResolveDefaultRendererIndex();
|
||||
}
|
||||
|
||||
return rendererIndex;
|
||||
}
|
||||
|
||||
private int ResolveDefaultRendererIndex()
|
||||
{
|
||||
EnsureRendererDataList();
|
||||
if (defaultRendererIndex < 0 ||
|
||||
defaultRendererIndex >= rendererDataList.Length)
|
||||
{
|
||||
defaultRendererIndex = 0;
|
||||
}
|
||||
|
||||
if (rendererDataList[defaultRendererIndex] == null)
|
||||
{
|
||||
rendererDataList[defaultRendererIndex] =
|
||||
new UniversalRendererData();
|
||||
}
|
||||
|
||||
return rendererDataList[defaultRendererIndex];
|
||||
return defaultRendererIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user