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:
2026-04-20 02:05:17 +08:00
parent 9e6c473186
commit cd29c8b2bc
12 changed files with 575 additions and 197 deletions

View File

@@ -0,0 +1,161 @@
# SRP Renderer-Driven Pipeline 执行接缝计划 2026-04-20
## 1. 阶段目标
上一阶段已经把 `CameraFramePlan` 的 managed 规划接缝接进来了:
1. `ScriptableRenderPipelineAsset -> ConfigureCameraFramePlan`
2. `UniversalRenderPipelineAsset -> ScriptableRendererData -> ScriptableRendererFeature`
但执行层还有一个明显没收干净的问题:
1. `UniversalRenderPipelineAsset` 仍然自己持有一套 rendererData/defaultRenderer/runtime cleanup 逻辑
2. `UniversalRenderPipeline` 仍然自己做一层很薄的 renderer forwarding
3. managed renderer 虽然已经存在,但还没有被提炼成正式的 renderer-driven pipeline 骨架
这一阶段的目标就是把这层骨架正式抽出来:
1. 增加通用的 `RendererDrivenRenderPipeline`
2. 增加通用的 `RendererBackedRenderPipelineAsset`
3. 增加 `RendererBackedRenderPipeline`
4. 给 Universal 正式迁移到这套骨架
5. 补上 renderer execution 侧的上下文类型,给后续 SRP/URP 继续扩张留出稳定接口
---
## 2. 当前问题
### 2.1 Universal 还在重复持有“通用 renderer 资产”逻辑
当前 `UniversalRenderPipelineAsset` 里同时承担了:
1. `rendererDataList/defaultRendererIndex`
2. `GetRendererData/GetRenderer`
3. `ConfigureCameraRenderRequest`
4. `ConfigureCameraFramePlan`
5. `GetPipelineRendererAssetKey`
6. `ReleaseRendererDataRuntimeResources`
这些其实已经不是 `Universal` 特有逻辑而是“renderer-backed pipeline asset”的通用职责。
### 2.2 Pipeline 执行骨架还没有提升成可复用抽象
当前 `UniversalRenderPipeline` 本质上只是:
1. 拿默认 renderer
2. 转发 `SupportsStageRenderGraph`
3. 转发 `RecordStageRenderGraph`
这层 forwarding 逻辑应该收成通用的 renderer-driven pipeline 基类,而不是继续散落在首方包里。
### 2.3 缺少 renderer execution 层自己的正式上下文对象
当前 renderer 执行时主要直接吃:
1. `ScriptableRenderContext`
2. `RenderingData`
这能工作,但在 API 组织上还缺一个更明确的“renderer 正在做执行决策”的上下文层。
这一阶段先补最小集合:
1. `RendererRecordingContext`
2. `RendererCameraRequestContext`
不扩 raw native API只做 managed 组织骨架。
---
## 3. 实施方案
### 3.1 Universal 包新增通用 renderer-driven 基类
新增:
1. `RendererDrivenRenderPipeline`
2. `RendererBackedRenderPipeline`
3. `RendererBackedRenderPipelineAsset`
职责边界:
1. `RendererDrivenRenderPipeline` 负责 pipeline -> renderer execution delegation
2. `RendererBackedRenderPipeline` 负责从 asset 解析默认 renderer
3. `RendererBackedRenderPipelineAsset` 负责 rendererData 列表、默认选择、request/plan/backend key/runtime cleanup
### 3.2 Universal 迁移到通用骨架
重构:
1. `UniversalRenderPipelineAsset : RendererBackedRenderPipelineAsset`
2. `UniversalRenderPipeline : RendererBackedRenderPipeline`
3. `UniversalRenderPipelineAsset` 只保留 Universal 自己的默认 rendererData 初始化
### 3.3 补 execution context 类型
新增:
1. `RendererRecordingContext`
2. `RendererCameraRequestContext`
这一步先做到:
1. 类型正式存在
2. pipeline / renderer 内部可以开始用它们组织 execution seam
3. 不强行扩大 public raw recording surface
### 3.4 用测试锁住新骨架
验证点:
1. API probe 能看到新类型
2. Universal 行为不回退
3. 通用 renderer-backed 骨架至少被现有 Universal 主链真实经过
---
## 4. 实施步骤
### Step 1新增 renderer-driven 基类
目标:
1. 新增 `RendererDrivenRenderPipeline`
2. 新增 `RendererBackedRenderPipeline`
3. 新增 `RendererBackedRenderPipelineAsset`
### Step 2迁移 Universal
目标:
1. `UniversalRenderPipelineAsset` 下放通用逻辑
2. `UniversalRenderPipeline` 改成继承通用基类
3. 保持现有 runtime / cleanup / default renderer 行为一致
### Step 3补 execution context 类型
目标:
1. 新增 `RendererRecordingContext`
2. 新增 `RendererCameraRequestContext`
3. 在 renderer-driven 骨架里用起来
### Step 4补测试与验证
目标:
1. 更新 `ScriptableRenderContextApiSurfaceProbe`
2. 更新 `test_mono_script_runtime.cpp`
3. 编译 `rendering_unit_tests``scripting_tests``XCEditor`
4. 运行 old editor 10s 冒烟并检查新的 `SceneReady`
---
## 5. 验收标准
完成后应满足:
1. `Universal` 不再自己持有整套通用 renderer-backed asset 逻辑
2. 存在正式的 `RendererDrivenRenderPipeline / RendererBackedRenderPipeline / RendererBackedRenderPipelineAsset`
3. 存在正式的 `RendererRecordingContext / RendererCameraRequestContext`
4. `Universal` 现有 request / plan / record 行为不回退
5. `scripting_tests``rendering_unit_tests``XCEditor`、old editor 冒烟全部通过