refactor(srp): unify mono recorder backend ownership
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user