Align SRP selection with asset refs

This commit is contained in:
2026-04-27 17:09:31 +08:00
parent c3f62c1fae
commit 2a7f6d0b60
9 changed files with 255 additions and 10 deletions

View File

@@ -28,7 +28,8 @@ enum class ResourceType : Core::uint8 {
UISchema,
VolumeField,
Model,
GaussianSplat
GaussianSplat,
RenderPipelineAsset
};
constexpr const char* GetResourceTypeName(ResourceType type) {
@@ -51,6 +52,7 @@ constexpr const char* GetResourceTypeName(ResourceType type) {
case ResourceType::VolumeField: return "VolumeField";
case ResourceType::Model: return "Model";
case ResourceType::GaussianSplat: return "GaussianSplat";
case ResourceType::RenderPipelineAsset: return "RenderPipelineAsset";
default: return "Unknown";
}
}

View File

@@ -104,9 +104,13 @@ Unity 兼容的公开命名、对象所有权和扩展点。
### 管线选择
- `GraphicsSettings.renderPipelineAsset == null` 表示 renderer 使用 engine default native pipeline selection。
- `GraphicsSettings.renderPipelineAsset != null` 表示 renderer 使用 managed SRP asset descriptor path。
- `GraphicsSettings.renderPipelineAsset != null` 表示 renderer 使用 render-pipeline asset reference selection path。
`AssetRef` 是长期选择身份managed descriptor/handle 只是运行时 materialization cache 和过渡 fallback。
- Runtime startup 不应静默指定 project default SRP asset。Project 或 editor policy 可以显式选择一个,
但 active rendering mode 必须能通过 `GraphicsSettings.renderPipelineAsset` 观察到。
- `GraphicsSettingsState` 同时保存 configured render-pipeline asset `AssetRef`
`ManagedRenderPipelineAssetDescriptor` runtime cache。只要 `AssetRef` 存在,它就是选择根;后续 managed
materialization 只能更新 descriptor cache不得清掉或替换该 asset reference。
- 如果 managed asset 无法创建有效 pipeline、recorder 或 backend bridge应显式失败并让 top-level factory
选择 fallback path。不要让 `ScriptableRenderPipelineHost` 看起来像成功的 managed SRP同时在背后用
hidden native path 渲染不受支持的 managed stage。
@@ -186,8 +190,11 @@ Native passes 仍用于 backend fallback、工具和 built-in rendering。
Managed SRP assets 通过 `GraphicsSettings.renderPipelineAsset` 选择,并通过
`ManagedScriptableRenderPipelineAsset` bridge。
- `ManagedRenderPipelineAssetDescriptor` 标识 managed asset assembly、namespace、classretained managed
object handle。Managed descriptors 存在 `GraphicsSettingsState`
- `ManagedRenderPipelineAssetDescriptor` 标识 managed asset assembly、namespace、classretained 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。
- `ManagedScriptableRenderPipelineAsset` 解析 `ManagedRenderPipelineAssetRuntime`,创建
`ScriptableRenderPipelineHost`,并把 request/plan/final-color policy calls 转发给 managed code。
- `ScriptableRenderPipelineHost` 组合 native backend asset 和可选 managed stage recorder。当 managed recorder
@@ -324,7 +331,8 @@ Scene data 每个 camera frame 提取一次,然后由 pipeline 调整。
authoring 还未公开。
- `UniversalPostProcessBlock` 仍保留 post-process source promotion helper实际 post-process stage 由
active pass queue 中的 features/passes 声明。
- `UniversalRendererData`features 是 code-created objects还不是完整 Unity 风格 serialized asset pipeline。
- Render-pipeline selection 已切到 `AssetRef` 作为根身份,但 `UniversalRendererData`features
`ScriptableObject` 字段/子资产仍是 code-created objects还不是完整 Unity 风格 serialized asset pipeline。
- 当前 shadow support 是单个 main directional shadow path没有 cascades。
- Graph compiler/executor 当前没有实现 pass culling 或 transient aliasing。
@@ -336,6 +344,8 @@ Scene data 每个 camera frame 提取一次,然后由 pipeline 调整。
- `GraphicsSettings.renderPipelineAsset` 已通过 `ManagedScriptableRenderPipelineAsset`
`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 execution 由 `ScriptableRenderPipelineHost` 承载,它组合 native backend 和可选 managed
stage recorder。
- Mono-backed SRP assets 使用 `DefaultNativeBackend` 做 scene drawing并把 managed stages 记录到 native

View File

@@ -27,7 +27,17 @@ public:
void SetConfiguredRenderPipelineAssetDescriptor(
const Pipelines::ManagedRenderPipelineAssetDescriptor& descriptor);
void SetConfiguredRenderPipelineAssetRef(
const Resources::AssetRef& assetRef);
void SetConfiguredRenderPipelineAssetSelection(
const Resources::AssetRef& assetRef,
const Pipelines::ManagedRenderPipelineAssetDescriptor& descriptor);
void UpdateConfiguredRenderPipelineAssetRuntimeDescriptor(
const Pipelines::ManagedRenderPipelineAssetDescriptor& descriptor);
void ClearConfiguredRenderPipelineAssetDescriptor();
Resources::AssetRef GetConfiguredRenderPipelineAssetRef() const {
return m_configuredRenderPipelineAssetRef;
}
Pipelines::ManagedRenderPipelineAssetDescriptor
GetConfiguredRenderPipelineAssetDescriptor() const {
return m_configuredRenderPipelineAssetDescriptor;
@@ -38,6 +48,7 @@ private:
Pipelines::ManagedRenderPipelineAssetDescriptor
m_configuredRenderPipelineAssetDescriptor = {};
Resources::AssetRef m_configuredRenderPipelineAssetRef = {};
std::shared_ptr<const Pipelines::ManagedRenderPipelineBridge>
m_managedRenderPipelineBridge = nullptr;
size_t m_managedRenderPipelineBridgeGeneration = 1u;

View File

@@ -1,5 +1,6 @@
#pragma once
#include <XCEngine/Core/Asset/AssetRef.h>
#include <XCEngine/Rendering/Pipelines/ScriptableRenderPipelineHost.h>
#include <cstdint>
@@ -31,6 +32,7 @@ struct ManagedRenderPipelineAssetDescriptor {
std::string namespaceName;
std::string className;
uint32_t managedAssetHandle = 0u;
Resources::AssetRef assetRef = {};
bool IsValid() const {
return !assemblyName.empty() && !className.empty();
@@ -40,6 +42,10 @@ struct ManagedRenderPipelineAssetDescriptor {
return managedAssetHandle != 0u;
}
bool HasAssetRef() const {
return assetRef.IsValid();
}
std::string GetFullName() const {
return namespaceName.empty()
? className
@@ -150,7 +156,15 @@ size_t GetManagedRenderPipelineEnvironmentGeneration();
void SetConfiguredManagedRenderPipelineAssetDescriptor(
const ManagedRenderPipelineAssetDescriptor& descriptor);
void SetConfiguredManagedRenderPipelineAssetRef(
const Resources::AssetRef& assetRef);
void SetConfiguredManagedRenderPipelineAssetSelection(
const Resources::AssetRef& assetRef,
const ManagedRenderPipelineAssetDescriptor& descriptor);
void UpdateConfiguredManagedRenderPipelineAssetRuntimeDescriptor(
const ManagedRenderPipelineAssetDescriptor& descriptor);
void ClearConfiguredManagedRenderPipelineAssetDescriptor();
Resources::AssetRef GetConfiguredManagedRenderPipelineAssetRef();
ManagedRenderPipelineAssetDescriptor
GetConfiguredManagedRenderPipelineAssetDescriptor();
std::shared_ptr<const RenderPipelineAsset>