refactor(srp): unify mono recorder backend ownership

This commit is contained in:
2026-04-19 23:09:34 +08:00
parent 74e790891c
commit 21b790c2f8
9 changed files with 352 additions and 9 deletions

View File

@@ -15,6 +15,7 @@
#include "Rendering/Internal/RenderPipelineFactory.h"
#include "Rendering/Passes/BuiltinVectorFullscreenPass.h"
#include "Rendering/Planning/FullscreenPassDesc.h"
#include "Rendering/Pipelines/BuiltinForwardPipeline.h"
#include "Rendering/Pipelines/NativeSceneRecorder.h"
#include "Rendering/Pipelines/ManagedScriptableRenderPipelineAsset.h"
#include "Rendering/RenderPipelineStageGraphContract.h"
@@ -718,6 +719,8 @@ public:
bool TryGetDefaultFinalColorSettings(
Rendering::FinalColorSettings& settings) const override;
std::shared_ptr<const Rendering::RenderPipelineAsset>
GetPipelineRendererAsset() const override;
MonoScriptRuntime* GetRuntime() const {
return m_runtime;
@@ -780,13 +783,20 @@ public:
}
}
m_fullscreenPassPool.clear();
if (m_defaultSceneRenderer != nullptr) {
m_defaultSceneRenderer->Shutdown();
if (m_ownedSceneRenderer != nullptr) {
m_ownedSceneRenderer->Shutdown();
}
ReleaseManagedObjects();
m_supportsStageMethod = nullptr;
m_recordStageMethod = nullptr;
m_pipelineCreationAttempted = false;
m_boundSceneRenderer = nullptr;
}
void SetPipelineRenderer(
Rendering::RenderPipelineRenderer* pipelineRenderer) override {
m_boundSceneRenderer =
dynamic_cast<Rendering::NativeSceneRenderer*>(pipelineRenderer);
}
bool SupportsStageRenderGraph(Rendering::CameraFrameStage stage) const override {
@@ -833,15 +843,13 @@ public:
ManagedScriptableRenderContextState managedContextState = {};
managedContextState.stage = context.stage;
managedContextState.graphContext = &context;
if (m_defaultSceneRenderer == nullptr) {
m_defaultSceneRenderer =
Rendering::Internal::CreateDefaultNativeSceneRenderer();
}
if (m_defaultSceneRenderer == nullptr) {
Rendering::NativeSceneRenderer* const sceneRenderer =
ResolveSceneRenderer();
if (sceneRenderer == nullptr) {
return false;
}
Rendering::Pipelines::NativeSceneRecorder sceneRecorder(
*m_defaultSceneRenderer,
*sceneRenderer,
context);
managedContextState.sceneRecorder = &sceneRecorder;
const uint64_t managedContextHandle =
@@ -964,6 +972,25 @@ private:
passes);
}
Rendering::NativeSceneRenderer* ResolveSceneRenderer() {
if (m_boundSceneRenderer != nullptr) {
return m_boundSceneRenderer;
}
if (m_ownedSceneRenderer == nullptr) {
const std::shared_ptr<const Rendering::RenderPipelineAsset>
pipelineRendererAsset =
m_assetRuntime != nullptr
? m_assetRuntime->GetPipelineRendererAsset()
: nullptr;
m_ownedSceneRenderer =
Rendering::Internal::CreateNativeSceneRendererFromAsset(
pipelineRendererAsset);
}
return m_ownedSceneRenderer.get();
}
std::shared_ptr<const MonoManagedRenderPipelineAssetRuntime> m_assetRuntime;
MonoScriptRuntime* m_runtime = nullptr;
mutable uint32_t m_pipelineHandle = 0;
@@ -971,7 +998,9 @@ private:
mutable MonoMethod* m_recordStageMethod = nullptr;
mutable bool m_pipelineCreationAttempted = false;
std::vector<std::unique_ptr<Rendering::RenderPass>> m_fullscreenPassPool = {};
std::unique_ptr<Rendering::NativeSceneRenderer> m_defaultSceneRenderer = nullptr;
Rendering::NativeSceneRenderer* m_boundSceneRenderer = nullptr;
std::unique_ptr<Rendering::NativeSceneRenderer> m_ownedSceneRenderer =
nullptr;
};
std::unique_ptr<Rendering::RenderPipelineStageRecorder>
@@ -1057,6 +1086,14 @@ bool MonoManagedRenderPipelineAssetRuntime::TryGetDefaultFinalColorSettings(
settings);
}
std::shared_ptr<const Rendering::RenderPipelineAsset>
MonoManagedRenderPipelineAssetRuntime::GetPipelineRendererAsset() const {
static const std::shared_ptr<const Rendering::RenderPipelineAsset>
s_builtinForwardPipelineAsset =
std::make_shared<Rendering::Pipelines::BuiltinForwardPipelineAsset>();
return s_builtinForwardPipelineAsset;
}
bool MonoManagedRenderPipelineAssetRuntime::CreateManagedPipeline(
uint32_t& outPipelineHandle) const {
outPipelineHandle = 0;