feat(srp): add renderer-driven pipeline backbone
Introduce renderer-driven and renderer-backed managed pipeline base types in the Universal package. Move shared renderer-data/default-renderer ownership out of UniversalRenderPipelineAsset, migrate probe assets onto the generic seam, and expose renderer recording/request context types for future SRP expansion. Update scripting API-surface expectations and validate with build, unit tests, scripting tests, and old editor smoke.
This commit is contained in:
@@ -4,170 +4,18 @@ using XCEngine.Rendering;
|
||||
namespace XCEngine.Rendering.Universal
|
||||
{
|
||||
public class UniversalRenderPipelineAsset
|
||||
: ScriptableRenderPipelineAsset
|
||||
: RendererBackedRenderPipelineAsset
|
||||
{
|
||||
public ScriptableRendererData[] rendererDataList =
|
||||
new ScriptableRendererData[]
|
||||
{
|
||||
new UniversalRendererData()
|
||||
};
|
||||
public int defaultRendererIndex = 0;
|
||||
|
||||
protected override ScriptableRenderPipeline CreatePipeline()
|
||||
protected override ScriptableRenderPipeline
|
||||
CreateRendererBackedPipeline()
|
||||
{
|
||||
return GetDefaultRendererData() != null
|
||||
? new UniversalRenderPipeline(this)
|
||||
: null;
|
||||
return new UniversalRenderPipeline(this);
|
||||
}
|
||||
|
||||
protected override void ConfigureCameraRenderRequest(
|
||||
CameraRenderRequestContext context)
|
||||
protected override ScriptableRendererData
|
||||
CreateDefaultRendererData()
|
||||
{
|
||||
ScriptableRendererData resolvedRendererData =
|
||||
GetDefaultRendererData();
|
||||
if (resolvedRendererData != null)
|
||||
{
|
||||
resolvedRendererData.ConfigureCameraRenderRequestInstance(
|
||||
context);
|
||||
}
|
||||
}
|
||||
|
||||
protected override void ConfigureCameraFramePlan(
|
||||
ScriptableRenderPipelinePlanningContext context)
|
||||
{
|
||||
ScriptableRendererData resolvedRendererData =
|
||||
GetDefaultRendererData();
|
||||
if (resolvedRendererData != null)
|
||||
{
|
||||
resolvedRendererData.ConfigureCameraFramePlanInstance(
|
||||
context);
|
||||
}
|
||||
}
|
||||
|
||||
protected override string GetPipelineRendererAssetKey()
|
||||
{
|
||||
ScriptableRendererData resolvedRendererData =
|
||||
GetDefaultRendererData();
|
||||
return resolvedRendererData != null
|
||||
? resolvedRendererData.GetPipelineRendererAssetKeyInstance()
|
||||
: string.Empty;
|
||||
}
|
||||
|
||||
protected override void ReleaseRuntimeResources()
|
||||
{
|
||||
ReleaseRendererDataRuntimeResources();
|
||||
}
|
||||
|
||||
internal ScriptableRendererData GetDefaultRendererData()
|
||||
{
|
||||
return GetRendererData(defaultRendererIndex);
|
||||
}
|
||||
|
||||
internal ScriptableRenderer GetDefaultRenderer()
|
||||
{
|
||||
return GetRenderer(defaultRendererIndex);
|
||||
}
|
||||
|
||||
internal ScriptableRendererData GetRendererData(
|
||||
int rendererIndex)
|
||||
{
|
||||
EnsureRendererDataList();
|
||||
int resolvedRendererIndex =
|
||||
ResolveRendererIndex(rendererIndex);
|
||||
if (rendererDataList[resolvedRendererIndex] == null)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
protected void ReleaseRendererDataRuntimeResources()
|
||||
{
|
||||
EnsureRendererDataList();
|
||||
|
||||
for (int i = 0; i < rendererDataList.Length; ++i)
|
||||
{
|
||||
ScriptableRendererData rendererData =
|
||||
rendererDataList[i];
|
||||
if (rendererData == null ||
|
||||
WasRendererDataReleasedEarlier(i))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
rendererData.ReleaseRuntimeResourcesInstance();
|
||||
}
|
||||
}
|
||||
|
||||
private bool WasRendererDataReleasedEarlier(
|
||||
int rendererDataIndex)
|
||||
{
|
||||
ScriptableRendererData rendererData =
|
||||
rendererDataList[rendererDataIndex];
|
||||
for (int i = 0; i < rendererDataIndex; ++i)
|
||||
{
|
||||
if (object.ReferenceEquals(
|
||||
rendererDataList[i],
|
||||
rendererData))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
return defaultRendererIndex;
|
||||
return new UniversalRendererData();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user