Align renderers to pipeline asset selection
This commit is contained in:
@@ -54,6 +54,10 @@ Unity 兼容的公开命名、对象所有权和扩展点。
|
||||
|
||||
- 行为变更要从 pipeline asset/request/plan 路径开始。app/editor 代码中的临时 pass execution
|
||||
通常表示层级位置不对。
|
||||
- 顶层 native renderer 的公开选择和配置入口只能是 `RenderPipelineAsset`。不要新增或恢复
|
||||
`CameraRenderer`、`RenderPipelineHost` 或 `SceneRenderer` 上接受裸 `RenderPipeline` 的 public
|
||||
constructor/setter;需要定制 pipeline 实例时,通过 `RenderPipelineAsset::CreatePipeline` 和
|
||||
`RenderPipelineAsset::ConfigurePipeline` 完成。
|
||||
- Native headers 保持小而后端无关。可行时 forward declare RHI 类型,只在后端代码里 include
|
||||
具体后端头。
|
||||
- 新增 camera-stack、renderer-index、shadow、depth、post-process 或 final output 行为时,不要绕过
|
||||
@@ -123,14 +127,15 @@ Unity 兼容的公开命名、对象所有权和扩展点。
|
||||
Native renderer 现在是 camera frame planner 加 RenderGraph executor,managed SRP/URP recording
|
||||
叠在 native scene draw backend 之上。
|
||||
|
||||
- `SceneRenderer` 是 scene-level convenience entry point。它通过 `SceneRenderRequestPlanner` 收集
|
||||
camera requests,通过 `RenderPipelineHost` 构建 frame plans,然后渲染排序后的 camera plans。
|
||||
- `SceneRenderer` 是 scene-level convenience entry point。它的公开管线选择根是 `RenderPipelineAsset`;
|
||||
它通过 `SceneRenderRequestPlanner` 收集 camera requests,通过 `RenderPipelineHost` 构建 frame plans,
|
||||
然后渲染排序后的 camera plans。
|
||||
- `RenderPipelineHost` 拥有一个 `CameraFramePlanBuilder` 和一个 `CameraRenderer`。它是从
|
||||
`CameraRenderRequest` 到 `CameraFramePlan` 的常规 native bridge。
|
||||
- `CameraRenderer` 拥有所选 `RenderPipeline`,提取 `RenderSceneData`,解析 directional shadow execution,
|
||||
把全部 frame stages 记录进 native `RenderGraph`,编译 graph 并执行。
|
||||
- `RenderPipelineAsset` 是 native asset contract。它创建 pipeline,配置 request policy,配置 frame plan
|
||||
policy,并提供默认 final color settings。
|
||||
`CameraRenderRequest` 到 `CameraFramePlan` 的常规 native bridge,并沿用同一个 asset selection root。
|
||||
- `CameraRenderer` 拥有 asset 创建出的所选 `RenderPipeline`,提取 `RenderSceneData`,解析 directional
|
||||
shadow execution,把全部 frame stages 记录进 native `RenderGraph`,编译 graph 并执行。
|
||||
- `RenderPipelineAsset` 是 native asset contract。它创建 pipeline,配置 pipeline 实例,配置 request
|
||||
policy,配置 frame plan policy,并提供默认 final color settings。
|
||||
- `RenderPipeline`、`RenderPipelineBackend` 和 `RenderPipelineStageRecorder` 将 backend rendering
|
||||
与 graph recording 分开。Managed SRP 通常提供 stage recorder,native backend 提供 scene drawing。
|
||||
- Native/managed bridge 词汇已经收口为 `PipelineBackend` 和 `SceneDrawBackend`。不要重新引入
|
||||
|
||||
@@ -28,11 +28,9 @@ struct RenderContext;
|
||||
class CameraRenderer {
|
||||
public:
|
||||
CameraRenderer();
|
||||
explicit CameraRenderer(std::unique_ptr<RenderPipeline> pipeline);
|
||||
explicit CameraRenderer(std::shared_ptr<const RenderPipelineAsset> pipelineAsset);
|
||||
~CameraRenderer();
|
||||
|
||||
void SetPipeline(std::unique_ptr<RenderPipeline> pipeline);
|
||||
void SetPipelineAsset(std::shared_ptr<const RenderPipelineAsset> pipelineAsset);
|
||||
RenderPipeline* GetPipeline() const;
|
||||
const RenderPipelineAsset* GetPipelineAsset() const;
|
||||
|
||||
@@ -13,11 +13,9 @@ class CameraFramePlanBuilder;
|
||||
class RenderPipelineHost {
|
||||
public:
|
||||
RenderPipelineHost();
|
||||
explicit RenderPipelineHost(std::unique_ptr<RenderPipeline> pipeline);
|
||||
explicit RenderPipelineHost(std::shared_ptr<const RenderPipelineAsset> pipelineAsset);
|
||||
~RenderPipelineHost();
|
||||
|
||||
void SetPipeline(std::unique_ptr<RenderPipeline> pipeline);
|
||||
void SetPipelineAsset(std::shared_ptr<const RenderPipelineAsset> pipelineAsset);
|
||||
RenderPipeline* GetPipeline() const { return m_cameraRenderer.GetPipeline(); }
|
||||
const RenderPipelineAsset* GetPipelineAsset() const { return m_cameraRenderer.GetPipelineAsset(); }
|
||||
|
||||
@@ -16,11 +16,9 @@ namespace Rendering {
|
||||
class SceneRenderer {
|
||||
public:
|
||||
SceneRenderer();
|
||||
explicit SceneRenderer(std::unique_ptr<RenderPipeline> pipeline);
|
||||
explicit SceneRenderer(std::shared_ptr<const RenderPipelineAsset> pipelineAsset);
|
||||
~SceneRenderer();
|
||||
|
||||
void SetPipeline(std::unique_ptr<RenderPipeline> pipeline);
|
||||
void SetPipelineAsset(std::shared_ptr<const RenderPipelineAsset> pipelineAsset);
|
||||
RenderPipeline* GetPipeline() const { return m_pipelineHost.GetPipeline(); }
|
||||
const RenderPipelineAsset* GetPipelineAsset() const { return m_pipelineHost.GetPipelineAsset(); }
|
||||
|
||||
@@ -36,9 +36,11 @@ void ConfigureTopLevelToolingPasses(RenderPipeline& pipeline) {
|
||||
#if XCENGINE_ENABLE_RENDERING_EDITOR_SUPPORT
|
||||
// Object-id is a tooling/editor request. It should live on the
|
||||
// top-level pipeline used by CameraRenderer, not on a scene backend.
|
||||
pipeline.SetCameraFrameStandalonePass(
|
||||
CameraFrameStage::ObjectId,
|
||||
std::make_unique<Passes::BuiltinObjectIdPass>());
|
||||
if (pipeline.GetCameraFrameStandalonePass(CameraFrameStage::ObjectId) == nullptr) {
|
||||
pipeline.SetCameraFrameStandalonePass(
|
||||
CameraFrameStage::ObjectId,
|
||||
std::make_unique<Passes::BuiltinObjectIdPass>());
|
||||
}
|
||||
#else
|
||||
(void)pipeline;
|
||||
#endif
|
||||
@@ -60,12 +62,6 @@ CameraRenderer::CameraRenderer()
|
||||
SetPipelineAsset(nullptr);
|
||||
}
|
||||
|
||||
CameraRenderer::CameraRenderer(std::unique_ptr<RenderPipeline> pipeline)
|
||||
: m_pipelineAsset(nullptr)
|
||||
, m_directionalShadowRuntime(std::make_unique<DirectionalShadowRuntime>()) {
|
||||
ResetPipeline(std::move(pipeline));
|
||||
}
|
||||
|
||||
CameraRenderer::CameraRenderer(std::shared_ptr<const RenderPipelineAsset> pipelineAsset)
|
||||
: m_directionalShadowRuntime(std::make_unique<DirectionalShadowRuntime>()) {
|
||||
SetPipelineAsset(std::move(pipelineAsset));
|
||||
@@ -77,13 +73,6 @@ CameraRenderer::~CameraRenderer() {
|
||||
}
|
||||
}
|
||||
|
||||
void CameraRenderer::SetPipeline(std::unique_ptr<RenderPipeline> pipeline) {
|
||||
m_pipelineAsset.reset();
|
||||
m_usesDefaultPipelineAssetSelection = false;
|
||||
m_managedPipelineEnvironmentGeneration = 0u;
|
||||
ResetPipeline(std::move(pipeline));
|
||||
}
|
||||
|
||||
void CameraRenderer::SetPipelineAsset(std::shared_ptr<const RenderPipelineAsset> pipelineAsset) {
|
||||
m_usesDefaultPipelineAssetSelection = pipelineAsset == nullptr;
|
||||
ResetPipeline(
|
||||
|
||||
@@ -22,11 +22,6 @@ RenderPipelineHost::RenderPipelineHost()
|
||||
: m_framePlanBuilder(std::make_unique<CameraFramePlanBuilder>()) {
|
||||
}
|
||||
|
||||
RenderPipelineHost::RenderPipelineHost(std::unique_ptr<RenderPipeline> pipeline)
|
||||
: m_cameraRenderer(std::move(pipeline))
|
||||
, m_framePlanBuilder(std::make_unique<CameraFramePlanBuilder>()) {
|
||||
}
|
||||
|
||||
RenderPipelineHost::RenderPipelineHost(std::shared_ptr<const RenderPipelineAsset> pipelineAsset)
|
||||
: m_cameraRenderer(std::move(pipelineAsset))
|
||||
, m_framePlanBuilder(std::make_unique<CameraFramePlanBuilder>()) {
|
||||
@@ -34,10 +29,6 @@ RenderPipelineHost::RenderPipelineHost(std::shared_ptr<const RenderPipelineAsset
|
||||
|
||||
RenderPipelineHost::~RenderPipelineHost() = default;
|
||||
|
||||
void RenderPipelineHost::SetPipeline(std::unique_ptr<RenderPipeline> pipeline) {
|
||||
m_cameraRenderer.SetPipeline(std::move(pipeline));
|
||||
}
|
||||
|
||||
void RenderPipelineHost::SetPipelineAsset(std::shared_ptr<const RenderPipelineAsset> pipelineAsset) {
|
||||
m_cameraRenderer.SetPipelineAsset(std::move(pipelineAsset));
|
||||
}
|
||||
|
||||
@@ -9,20 +9,12 @@ namespace Rendering {
|
||||
SceneRenderer::SceneRenderer() {
|
||||
}
|
||||
|
||||
SceneRenderer::SceneRenderer(std::unique_ptr<RenderPipeline> pipeline)
|
||||
: m_pipelineHost(std::move(pipeline)) {
|
||||
}
|
||||
|
||||
SceneRenderer::SceneRenderer(std::shared_ptr<const RenderPipelineAsset> pipelineAsset)
|
||||
: m_pipelineHost(std::move(pipelineAsset)) {
|
||||
}
|
||||
|
||||
SceneRenderer::~SceneRenderer() = default;
|
||||
|
||||
void SceneRenderer::SetPipeline(std::unique_ptr<RenderPipeline> pipeline) {
|
||||
m_pipelineHost.SetPipeline(std::move(pipeline));
|
||||
}
|
||||
|
||||
void SceneRenderer::SetPipelineAsset(std::shared_ptr<const RenderPipelineAsset> pipelineAsset) {
|
||||
m_pipelineHost.SetPipelineAsset(std::move(pipelineAsset));
|
||||
}
|
||||
|
||||
@@ -48,7 +48,12 @@ std::unique_ptr<RenderPipeline> TryCreateRenderPipelineFromAsset(
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return asset->CreatePipeline();
|
||||
std::unique_ptr<RenderPipeline> pipeline =
|
||||
asset->CreatePipeline();
|
||||
if (pipeline != nullptr) {
|
||||
asset->ConfigurePipeline(*pipeline);
|
||||
}
|
||||
return pipeline;
|
||||
}
|
||||
|
||||
std::unique_ptr<RenderPipelineBackend> TryCreatePipelineBackendFromAsset(
|
||||
@@ -57,7 +62,12 @@ std::unique_ptr<RenderPipelineBackend> TryCreatePipelineBackendFromAsset(
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return asset->CreatePipeline();
|
||||
std::unique_ptr<RenderPipeline> pipeline =
|
||||
asset->CreatePipeline();
|
||||
if (pipeline != nullptr) {
|
||||
asset->ConfigurePipeline(*pipeline);
|
||||
}
|
||||
return pipeline;
|
||||
}
|
||||
|
||||
std::unique_ptr<SceneDrawBackend> TryCreateSceneDrawBackendFromAsset(
|
||||
@@ -128,10 +138,24 @@ std::unique_ptr<RenderPipeline> CreateRenderPipelineOrDefault(
|
||||
return pipeline;
|
||||
}
|
||||
|
||||
const std::shared_ptr<const RenderPipelineAsset> defaultAsset =
|
||||
ResolveRenderPipelineAssetOrDefault(nullptr);
|
||||
if (defaultAsset != nullptr &&
|
||||
defaultAsset != resolvedAsset) {
|
||||
if (std::unique_ptr<RenderPipeline> pipeline =
|
||||
TryCreateRenderPipelineFromAsset(defaultAsset)) {
|
||||
if (outResolvedAsset != nullptr) {
|
||||
*outResolvedAsset = defaultAsset;
|
||||
}
|
||||
return pipeline;
|
||||
}
|
||||
}
|
||||
|
||||
const std::shared_ptr<const RenderPipelineAsset> fallbackAsset =
|
||||
CreateFallbackRenderPipelineAsset();
|
||||
if (fallbackAsset != nullptr &&
|
||||
fallbackAsset != resolvedAsset) {
|
||||
fallbackAsset != resolvedAsset &&
|
||||
fallbackAsset != defaultAsset) {
|
||||
if (std::unique_ptr<RenderPipeline> pipeline =
|
||||
TryCreateRenderPipelineFromAsset(fallbackAsset)) {
|
||||
if (outResolvedAsset != nullptr) {
|
||||
@@ -142,9 +166,10 @@ std::unique_ptr<RenderPipeline> CreateRenderPipelineOrDefault(
|
||||
}
|
||||
|
||||
if (outResolvedAsset != nullptr) {
|
||||
*outResolvedAsset =
|
||||
fallbackAsset != nullptr
|
||||
? fallbackAsset
|
||||
*outResolvedAsset = fallbackAsset != nullptr
|
||||
? fallbackAsset
|
||||
: defaultAsset != nullptr
|
||||
? defaultAsset
|
||||
: resolvedAsset;
|
||||
}
|
||||
return Pipelines::Internal::CreateConfiguredBuiltinForwardPipeline();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user