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

@@ -149,7 +149,8 @@ bool CameraFramePlan::IsFullscreenStageRequested(CameraFrameStage stage) const {
bool CameraFramePlan::RequestFullscreenStage(
CameraFrameStage stage,
CameraFrameColorSource source,
bool usesGraphManagedOutputColor) {
bool usesGraphManagedOutputColor,
bool explicitlyConfigured) {
CameraFrameFullscreenStagePlan* const fullscreenStagePlan =
GetMutableFullscreenStagePlan(*this, stage);
FullscreenPassRenderRequest* const fullscreenRequest =
@@ -164,6 +165,9 @@ bool CameraFramePlan::RequestFullscreenStage(
stage == CameraFrameStage::PostProcess
? usesGraphManagedOutputColor
: false;
fullscreenStagePlan->explicitlyConfigured =
fullscreenStagePlan->explicitlyConfigured ||
explicitlyConfigured;
if (source != CameraFrameColorSource::ExplicitSurface) {
fullscreenRequest->sourceSurface = {};
@@ -184,15 +188,21 @@ bool CameraFramePlan::RequestFullscreenStage(
return true;
}
void CameraFramePlan::ClearFullscreenStage(CameraFrameStage stage) {
void CameraFramePlan::ClearFullscreenStage(
CameraFrameStage stage,
bool explicitlyConfigured) {
if (stage == CameraFrameStage::PostProcess) {
ClearOwnedPostProcessSequence();
postProcess = {};
colorChain.postProcess = {};
colorChain.postProcess.explicitlyConfigured =
explicitlyConfigured;
} else if (stage == CameraFrameStage::FinalOutput) {
ClearOwnedFinalOutputSequence();
finalOutput = {};
colorChain.finalOutput = {};
colorChain.finalOutput.explicitlyConfigured =
explicitlyConfigured;
} else {
return;
}
@@ -200,6 +210,17 @@ void CameraFramePlan::ClearFullscreenStage(CameraFrameStage stage) {
RefreshGraphManagedSceneSurfaceState();
}
bool CameraFramePlan::HasExplicitFullscreenStageConfiguration(
CameraFrameStage stage) const {
if (const CameraFrameFullscreenStagePlan* fullscreenStagePlan =
GetFullscreenStagePlan(stage);
fullscreenStagePlan != nullptr) {
return fullscreenStagePlan->explicitlyConfigured;
}
return false;
}
bool CameraFramePlan::IsPostProcessStageValid() const {
if (!IsFullscreenStageRequested(CameraFrameStage::PostProcess)) {
return true;