Serialize managed SRP asset graphs

This commit is contained in:
2026-04-27 19:35:17 +08:00
parent 8353da05e5
commit c0b670b052
10 changed files with 1568 additions and 25 deletions

View File

@@ -109,7 +109,8 @@ Unity 兼容的公开命名、对象所有权和扩展点。
- `GraphicsSettings.renderPipelineAsset == null` 表示 renderer 使用 engine default native pipeline selection。
- `GraphicsSettings.renderPipelineAsset != null` 表示 renderer 使用 render-pipeline asset reference selection path。
`AssetRef` 是长期选择身份managed descriptor/handle 只是运行时 materialization cache 和过渡 fallback。
`AssetRef` 是长期选择身份managed descriptor 中的 serialized ScriptableObject graph 和 handle 只是运行时
materialization cache 和过渡 fallback。
- Runtime startup 不应静默指定 project default SRP asset。Project 或 editor policy 可以显式选择一个,
但 active rendering mode 必须能通过 `GraphicsSettings.renderPipelineAsset` 观察到。
- `GraphicsSettingsState` 同时保存 configured render-pipeline asset `AssetRef`
@@ -198,11 +199,16 @@ Native passes 仍用于 backend fallback、工具和 built-in rendering。
Managed SRP assets 通过 `GraphicsSettings.renderPipelineAsset` 选择,并通过
`ManagedScriptableRenderPipelineAsset` bridge。
- `ManagedRenderPipelineAssetDescriptor` 标识 managed asset assembly、namespace、class、retained managed
object handle 和可选 `AssetRef`。它不再是 configured pipeline 的唯一身份;`GraphicsSettingsState` 中的
configured `AssetRef` 才是 Unity 风格 asset selection root。
- Descriptor-only selection 仍保留给测试、legacy runtime fallback 和尚未接入 asset serialization 的路径。
一旦已有 configured `AssetRef`,不要把 managed object handle 或 descriptor 当作长期 asset identity。
- `ManagedRenderPipelineAssetDescriptor` 标识 managed asset assembly、namespace、class、可选 `AssetRef`
serialized ScriptableObject asset graph 和 retained managed object handle。它不再是 configured pipeline
的唯一身份;`GraphicsSettingsState` 中的 configured `AssetRef` 才是 Unity 风格 asset selection root。
- Descriptor-only selection 仍保留给测试、legacy runtime fallback 和尚未接入 asset import 的路径。没有
`serializedAssetGraph` 时才允许按 class 默认构造 materialize一旦 snapshot 存在,缺失或失效的
managed object handle 必须从 snapshot 重建,不能退回 code-created default asset。
- `GraphicsSettings.renderPipelineAsset = asset` 必须把当前 managed SRP asset graph snapshot 收进 descriptor。
该 snapshot 覆盖 `UniversalRenderPipelineAsset -> ScriptableRendererData -> ScriptableRendererFeature`
以及 public/`[SerializeField]` serializable settings。Runtime cache 更新可以替换 handle但不得丢失
snapshot 或 configured `AssetRef`
- `ManagedScriptableRenderPipelineAsset` 解析 `ManagedRenderPipelineAssetRuntime`,创建
`ScriptableRenderPipelineHost`,并把 request/plan/final-color policy calls 转发给 managed code。
- `ScriptableRenderPipelineHost` 组合 native backend asset 和可选 managed stage recorder。当 managed recorder
@@ -339,8 +345,8 @@ Scene data 每个 camera frame 提取一次,然后由 pipeline 调整。
authoring 还未公开。
- `UniversalPostProcessBlock` 仍保留 post-process source promotion helper实际 post-process stage 由
active pass queue 中的 features/passes 声明。
- Render-pipeline selection 已切到 `AssetRef` 作为根身份,`UniversalRendererData`、features 和
`ScriptableObject` 字段/子资产仍是 code-created objects还不是完整 Unity 风格 serialized asset pipeline
- Render-pipeline selection 已切到 `AssetRef` 作为根身份,并且 managed SRP descriptor 已保存
ScriptableObject graph snapshot完整 editor/importer `.asset` 持久化和 sub-asset authoring 仍未完成
- 当前 shadow support 是单个 main directional shadow path没有 cascades。
- Graph compiler/executor 当前没有实现 pass culling 或 transient aliasing。
@@ -354,6 +360,9 @@ Scene data 每个 camera frame 提取一次,然后由 pipeline 调整。
`GraphicsSettingsState` 选择 managed SRP assets。
- Render-pipeline asset selection 已从 descriptor/managed handle 切到 `AssetRef` 根身份descriptor 保留为
assembly/type/handle runtime cachemanaged materialization 更新 cache 时保留 configured asset reference。
- Managed SRP descriptor 已接入 serialized ScriptableObject graph snapshot。`GraphicsSettings` setter 保存
当前 asset/data/features 图getter 和 `MonoManagedRenderPipelineAssetRuntime` 在 handle 缺失或失效时按
snapshot 重建;无 snapshot 的 descriptor-only selection 才保留 class 默认构造 fallback。
- Managed SRP execution 由 `ScriptableRenderPipelineHost` 承载,它组合 native backend 和可选 managed
stage recorder。
- Mono-backed SRP assets 使用 `DefaultNativeBackend` 做 scene drawing并把 managed stages 记录到 native

View File

@@ -33,6 +33,7 @@ struct ManagedRenderPipelineAssetDescriptor {
std::string className;
uint32_t managedAssetHandle = 0u;
Resources::AssetRef assetRef = {};
std::string serializedAssetGraph;
bool IsValid() const {
return !assemblyName.empty() && !className.empty();
@@ -46,6 +47,10 @@ struct ManagedRenderPipelineAssetDescriptor {
return assetRef.IsValid();
}
bool HasSerializedAssetGraph() const {
return !serializedAssetGraph.empty();
}
std::string GetFullName() const {
return namespaceName.empty()
? className

View File

@@ -103,6 +103,12 @@ public:
const char* passName,
uint64_t commandBufferHandle);
bool IsScriptableRenderPipelineAssetObject(MonoObject* managedObject) const;
bool TrySerializeManagedRenderPipelineAssetGraph(
MonoObject* managedObject,
std::string& outSerializedGraph);
bool TryCreateManagedRenderPipelineAssetFromSerializedGraph(
const std::string& serializedGraph,
uint32_t& outHandle);
bool TryEnsureManagedRenderPipelineAssetHandle(
Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor& ioDescriptor);
@@ -266,6 +272,9 @@ private:
bool CreateExternalManagedObject(
MonoClass* monoClass,
uint32_t& outHandle);
bool TryDeserializeManagedRenderPipelineAssetGraph(
const std::string& serializedGraph,
MonoObject*& outAsset);
uint32_t RetainExternalManagedObject(MonoObject* instance);
void DestroyExternalManagedObject(uint32_t gcHandle);
MonoObject* CreateManagedScriptableRenderContext(uint64_t nativeHandle);