refactor(rendering): add srp host stage recorder bridge

This commit is contained in:
2026-04-15 20:07:52 +08:00
parent 22a2b982ef
commit cafe3c8076
6 changed files with 283 additions and 5 deletions

View File

@@ -13,6 +13,11 @@ ManagedRenderPipelineAssetDescriptor& GetManagedRenderPipelineAssetDescriptorSto
return s_descriptor;
}
std::shared_ptr<const ManagedRenderPipelineBridge>& GetManagedRenderPipelineBridgeStorage() {
static std::shared_ptr<const ManagedRenderPipelineBridge> s_bridge = nullptr;
return s_bridge;
}
} // namespace
ManagedScriptableRenderPipelineAsset::ManagedScriptableRenderPipelineAsset(
@@ -21,13 +26,40 @@ ManagedScriptableRenderPipelineAsset::ManagedScriptableRenderPipelineAsset(
}
std::unique_ptr<RenderPipeline> ManagedScriptableRenderPipelineAsset::CreatePipeline() const {
return m_fallbackAsset.CreatePipeline();
std::unique_ptr<RenderPipeline> pipeline = m_fallbackAsset.CreatePipeline();
auto* host = dynamic_cast<ScriptableRenderPipelineHost*>(pipeline.get());
if (host == nullptr) {
return pipeline;
}
const std::shared_ptr<const ManagedRenderPipelineBridge> bridge =
GetManagedRenderPipelineBridgeStorage();
if (bridge != nullptr) {
host->SetStageRecorder(
bridge->CreateStageRecorder(m_descriptor));
}
return pipeline;
}
FinalColorSettings ManagedScriptableRenderPipelineAsset::GetDefaultFinalColorSettings() const {
return m_fallbackAsset.GetDefaultFinalColorSettings();
}
void SetManagedRenderPipelineBridge(
std::shared_ptr<const ManagedRenderPipelineBridge> bridge) {
GetManagedRenderPipelineBridgeStorage() = std::move(bridge);
}
void ClearManagedRenderPipelineBridge() {
GetManagedRenderPipelineBridgeStorage().reset();
}
std::shared_ptr<const ManagedRenderPipelineBridge>
GetManagedRenderPipelineBridge() {
return GetManagedRenderPipelineBridgeStorage();
}
void SetManagedRenderPipelineAssetDescriptor(
const ManagedRenderPipelineAssetDescriptor& descriptor) {
GetManagedRenderPipelineAssetDescriptorStorage() = descriptor;

View File

@@ -71,6 +71,11 @@ ScriptableRenderPipelineHost::~ScriptableRenderPipelineHost() {
Shutdown();
}
void ScriptableRenderPipelineHost::SetStageRecorder(
std::unique_ptr<RenderPipelineStageRecorder> stageRecorder) {
ResetStageRecorder(std::move(stageRecorder));
}
void ScriptableRenderPipelineHost::SetPipelineRenderer(
std::unique_ptr<RenderPipelineRenderer> pipelineRenderer) {
m_pipelineRendererAsset.reset();
@@ -88,11 +93,25 @@ void ScriptableRenderPipelineHost::SetPipelineRendererAsset(
}
bool ScriptableRenderPipelineHost::Initialize(const RenderContext& context) {
return m_pipelineRenderer != nullptr &&
m_pipelineRenderer->Initialize(context);
if (m_pipelineRenderer == nullptr ||
!m_pipelineRenderer->Initialize(context)) {
return false;
}
if (m_stageRecorder != nullptr &&
!m_stageRecorder->Initialize(context)) {
m_stageRecorder->Shutdown();
m_pipelineRenderer->Shutdown();
return false;
}
return true;
}
void ScriptableRenderPipelineHost::Shutdown() {
if (m_stageRecorder != nullptr) {
m_stageRecorder->Shutdown();
}
if (m_pipelineRenderer != nullptr) {
m_pipelineRenderer->Shutdown();
}
@@ -101,12 +120,19 @@ void ScriptableRenderPipelineHost::Shutdown() {
bool ScriptableRenderPipelineHost::SupportsStageRenderGraph(
CameraFrameStage stage) const {
return m_pipelineRenderer != nullptr &&
m_pipelineRenderer->SupportsStageRenderGraph(stage);
return (m_stageRecorder != nullptr &&
m_stageRecorder->SupportsStageRenderGraph(stage)) ||
(m_pipelineRenderer != nullptr &&
m_pipelineRenderer->SupportsStageRenderGraph(stage));
}
bool ScriptableRenderPipelineHost::RecordStageRenderGraph(
const RenderPipelineStageRenderGraphContext& context) {
if (m_stageRecorder != nullptr &&
m_stageRecorder->SupportsStageRenderGraph(context.stage)) {
return m_stageRecorder->RecordStageRenderGraph(context);
}
return m_pipelineRenderer != nullptr &&
m_pipelineRenderer->RecordStageRenderGraph(context);
}
@@ -125,6 +151,15 @@ bool ScriptableRenderPipelineHost::Render(
m_pipelineRenderer->Render(context, surface, sceneData);
}
void ScriptableRenderPipelineHost::ResetStageRecorder(
std::unique_ptr<RenderPipelineStageRecorder> stageRecorder) {
if (m_stageRecorder != nullptr) {
m_stageRecorder->Shutdown();
}
m_stageRecorder = std::move(stageRecorder);
}
void ScriptableRenderPipelineHost::ResetPipelineRenderer(
std::unique_ptr<RenderPipelineRenderer> pipelineRenderer) {
if (m_pipelineRenderer != nullptr) {