refactor(srp): add renderer data invalidation seam

Introduce ScriptableRendererData dirty/invalidation support so renderer and feature caches can be released and rebuilt within the same managed asset runtime.

Add managed probes and scripting coverage for non-public dirty APIs and for renderer rebuild after invalidation, then archive the completed phase plan.
This commit is contained in:
2026-04-20 02:48:16 +08:00
parent 5e88449e3d
commit d196ec9264
5 changed files with 466 additions and 24 deletions

View File

@@ -8,6 +8,7 @@ namespace XCEngine.Rendering.Universal
{
private ScriptableRendererFeature[] m_rendererFeatures;
private ScriptableRenderer m_rendererInstance;
private bool m_rendererInvalidated;
protected ScriptableRendererData()
{
@@ -26,6 +27,7 @@ namespace XCEngine.Rendering.Universal
if (m_rendererInstance != null)
{
SetupRendererInstance(m_rendererInstance);
m_rendererInvalidated = false;
}
}
@@ -48,6 +50,11 @@ namespace XCEngine.Rendering.Universal
SetupRenderer(renderer);
}
internal void SetDirtyInstance()
{
SetDirty();
}
internal string GetPipelineRendererAssetKeyInstance()
{
return GetPipelineRendererAssetKey();
@@ -55,31 +62,9 @@ namespace XCEngine.Rendering.Universal
internal void ReleaseRuntimeResourcesInstance()
{
if (m_rendererInstance != null)
{
m_rendererInstance.ReleaseRuntimeResourcesInstance();
m_rendererInstance = null;
m_rendererFeatures = null;
ReleaseRuntimeResources();
return;
}
if (m_rendererFeatures != null)
{
for (int i = 0; i < m_rendererFeatures.Length; ++i)
{
ScriptableRendererFeature rendererFeature =
m_rendererFeatures[i];
if (rendererFeature != null)
{
rendererFeature.ReleaseRuntimeResourcesInstance();
}
}
m_rendererFeatures = null;
}
ReleaseRendererSetupCache();
ReleaseRuntimeResources();
m_rendererInvalidated = false;
}
internal void ConfigureCameraRenderRequestInstance(
@@ -163,6 +148,14 @@ namespace XCEngine.Rendering.Universal
{
}
protected bool isInvalidated
{
get
{
return m_rendererInvalidated;
}
}
protected bool HasDirectionalShadow(
CameraRenderRequestContext context)
{
@@ -185,6 +178,12 @@ namespace XCEngine.Rendering.Universal
context.nativeHandle);
}
protected void SetDirty()
{
ReleaseRendererSetupCache();
m_rendererInvalidated = true;
}
protected void AddRendererFeature(
ScriptableRenderer renderer,
ScriptableRendererFeature rendererFeature)
@@ -227,6 +226,34 @@ namespace XCEngine.Rendering.Universal
return m_rendererFeatures;
}
private void ReleaseRendererSetupCache()
{
if (m_rendererInstance != null)
{
m_rendererInstance.ReleaseRuntimeResourcesInstance();
m_rendererInstance = null;
m_rendererFeatures = null;
return;
}
if (m_rendererFeatures == null)
{
return;
}
for (int i = 0; i < m_rendererFeatures.Length; ++i)
{
ScriptableRendererFeature rendererFeature =
m_rendererFeatures[i];
if (rendererFeature != null)
{
rendererFeature.ReleaseRuntimeResourcesInstance();
}
}
m_rendererFeatures = null;
}
}
}