feat(srp): add managed camera frame planning seam

Expose native camera frame planning controls to managed pipeline assets and renderer features.

Allow managed planning to override fullscreen stage heuristics while keeping CameraFramePlan as the native execution contract.

Add scripting coverage, probe assets, and archive the phase plan after build, test, and editor smoke validation.
This commit is contained in:
2026-04-20 01:48:16 +08:00
parent 58dde75d3d
commit 9e6c473186
17 changed files with 926 additions and 9 deletions

View File

@@ -389,6 +389,38 @@ namespace XCEngine
internal static extern int Rendering_ScriptableRenderContext_GetStage(
ulong nativeHandle);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool
Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested(
ulong nativeHandle,
int stage);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int
Rendering_ScriptableRenderPipelinePlanningContext_GetStageColorSource(
ulong nativeHandle,
int stage);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool
Rendering_ScriptableRenderPipelinePlanningContext_GetStageUsesGraphManagedOutputColor(
ulong nativeHandle,
int stage);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern bool
Rendering_ScriptableRenderPipelinePlanningContext_RequestFullscreenStage(
ulong nativeHandle,
int stage,
int source,
bool usesGraphManagedOutputColor);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern void
Rendering_ScriptableRenderPipelinePlanningContext_ClearFullscreenStage(
ulong nativeHandle,
int stage);
[MethodImpl(MethodImplOptions.InternalCall)]
internal static extern int
Rendering_ScriptableRenderContext_GetStageColorSource(

View File

@@ -13,6 +13,12 @@ namespace XCEngine.Rendering
ReleaseRuntimeResources();
}
internal void ConfigureCameraFramePlanInstance(
ScriptableRenderPipelinePlanningContext context)
{
ConfigureCameraFramePlan(context);
}
protected virtual ScriptableRenderPipeline CreatePipeline()
{
return null;
@@ -23,6 +29,11 @@ namespace XCEngine.Rendering
{
}
protected virtual void ConfigureCameraFramePlan(
ScriptableRenderPipelinePlanningContext context)
{
}
protected virtual FinalColorSettings GetDefaultFinalColorSettings()
{
return FinalColorSettings.CreateDefault();

View File

@@ -0,0 +1,64 @@
using XCEngine;
namespace XCEngine.Rendering
{
public sealed class ScriptableRenderPipelinePlanningContext
{
private readonly ulong m_nativeHandle;
internal ScriptableRenderPipelinePlanningContext(
ulong nativeHandle)
{
m_nativeHandle = nativeHandle;
}
public bool IsStageRequested(
CameraFrameStage stage)
{
return InternalCalls
.Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested(
m_nativeHandle,
(int)stage);
}
public CameraFrameColorSource GetStageColorSource(
CameraFrameStage stage)
{
return (CameraFrameColorSource)InternalCalls
.Rendering_ScriptableRenderPipelinePlanningContext_GetStageColorSource(
m_nativeHandle,
(int)stage);
}
public bool UsesGraphManagedOutputColor(
CameraFrameStage stage)
{
return InternalCalls
.Rendering_ScriptableRenderPipelinePlanningContext_GetStageUsesGraphManagedOutputColor(
m_nativeHandle,
(int)stage);
}
public bool RequestFullscreenStage(
CameraFrameStage stage,
CameraFrameColorSource source,
bool usesGraphManagedOutputColor = false)
{
return InternalCalls
.Rendering_ScriptableRenderPipelinePlanningContext_RequestFullscreenStage(
m_nativeHandle,
(int)stage,
(int)source,
usesGraphManagedOutputColor);
}
public void ClearFullscreenStage(
CameraFrameStage stage)
{
InternalCalls
.Rendering_ScriptableRenderPipelinePlanningContext_ClearFullscreenStage(
m_nativeHandle,
(int)stage);
}
}
}

View File

@@ -89,6 +89,28 @@ namespace XCEngine.Rendering.Universal
}
}
internal void ConfigureCameraFramePlanInstance(
ScriptableRenderPipelinePlanningContext context)
{
ConfigureCameraFramePlan(context);
ScriptableRendererFeature[] rendererFeatures =
GetRendererFeatures();
for (int i = 0; i < rendererFeatures.Length; ++i)
{
ScriptableRendererFeature rendererFeature =
rendererFeatures[i];
if (rendererFeature == null ||
!rendererFeature.isActive)
{
continue;
}
rendererFeature.ConfigureCameraFramePlan(
context);
}
}
protected virtual ScriptableRenderer CreateRenderer()
{
return null;
@@ -99,6 +121,11 @@ namespace XCEngine.Rendering.Universal
{
}
protected virtual void ConfigureCameraFramePlan(
ScriptableRenderPipelinePlanningContext context)
{
}
protected virtual string GetPipelineRendererAssetKey()
{
return string.Empty;

View File

@@ -33,6 +33,11 @@ namespace XCEngine.Rendering.Universal
{
}
public virtual void ConfigureCameraFramePlan(
ScriptableRenderPipelinePlanningContext context)
{
}
public virtual void AddRenderPasses(
ScriptableRenderer renderer,
RenderingData renderingData)

View File

@@ -32,6 +32,18 @@ namespace XCEngine.Rendering.Universal
}
}
protected override void ConfigureCameraFramePlan(
ScriptableRenderPipelinePlanningContext context)
{
ScriptableRendererData resolvedRendererData =
GetDefaultRendererData();
if (resolvedRendererData != null)
{
resolvedRendererData.ConfigureCameraFramePlanInstance(
context);
}
}
protected override string GetPipelineRendererAssetKey()
{
ScriptableRendererData resolvedRendererData =