refactor(srp): model shared native backend substrate

This commit is contained in:
2026-04-21 19:31:52 +08:00
parent f2806b0136
commit 97bd990b12
4 changed files with 124 additions and 56 deletions

View File

@@ -1498,9 +1498,7 @@ public:
bool TryGetDefaultFinalColorSettings(
Rendering::FinalColorSettings& settings) const override;
std::shared_ptr<const Rendering::RenderPipelineAsset>
GetPipelineBackendAsset() const override;
std::shared_ptr<const Rendering::RenderPipelineAsset>
GetPipelineBackendAsset(int32_t rendererIndex) const override;
GetSharedPipelineBackendAsset() const override;
bool UsesNativeCameraFramePlanBaseline() const override;
bool UsesNativeCameraFramePlanBaseline(
int32_t rendererIndex) const override;
@@ -1571,9 +1569,9 @@ private:
mutable int32_t m_runtimeResourceVersion = 0;
mutable uint32_t m_pipelineHandle = 0;
mutable bool m_pipelineCreationAttempted = false;
mutable bool m_pipelineBackendAssetResolved = false;
mutable bool m_sharedPipelineBackendAssetResolved = false;
mutable std::shared_ptr<const Rendering::RenderPipelineAsset>
m_pipelineBackendAsset = nullptr;
m_sharedPipelineBackendAsset = nullptr;
};
class MonoManagedRenderPipelineStageRecorder final
@@ -1607,7 +1605,7 @@ public:
if (m_ownedSceneDrawBackend != nullptr) {
m_ownedSceneDrawBackend->Shutdown();
}
m_ownedPipelineBackendAsset.reset();
m_ownedSharedPipelineBackendAsset.reset();
m_supportsStageContextualMethod = nullptr;
m_supportsStageMethod = nullptr;
m_recordStageMethod = nullptr;
@@ -1718,7 +1716,7 @@ public:
managedContextState.stage = context.stage;
managedContextState.graphContext = &context;
Rendering::SceneDrawBackend* const sceneDrawBackend =
ResolveSceneDrawBackend(context.rendererIndex);
ResolveSceneDrawBackend();
if (sceneDrawBackend == nullptr) {
return false;
}
@@ -1904,40 +1902,31 @@ private:
return true;
}
Rendering::SceneDrawBackend* ResolveSceneDrawBackend(
int32_t rendererIndex) {
const std::shared_ptr<const Rendering::RenderPipelineAsset>
contextualPipelineBackendAsset =
m_assetRuntime != nullptr
? m_assetRuntime->GetPipelineBackendAsset(
rendererIndex)
: nullptr;
const std::shared_ptr<const Rendering::RenderPipelineAsset>
defaultPipelineBackendAsset =
m_assetRuntime != nullptr
? m_assetRuntime->GetPipelineBackendAsset()
: nullptr;
if (m_boundSceneDrawBackend != nullptr &&
contextualPipelineBackendAsset != nullptr &&
contextualPipelineBackendAsset ==
defaultPipelineBackendAsset) {
Rendering::SceneDrawBackend* ResolveSceneDrawBackend() {
if (m_boundSceneDrawBackend != nullptr) {
return m_boundSceneDrawBackend;
}
if (contextualPipelineBackendAsset == nullptr) {
const std::shared_ptr<const Rendering::RenderPipelineAsset>
sharedPipelineBackendAsset =
m_assetRuntime != nullptr
? m_assetRuntime->GetSharedPipelineBackendAsset()
: nullptr;
if (sharedPipelineBackendAsset == nullptr) {
return nullptr;
}
if (m_ownedSceneDrawBackend == nullptr ||
contextualPipelineBackendAsset != m_ownedPipelineBackendAsset) {
sharedPipelineBackendAsset !=
m_ownedSharedPipelineBackendAsset) {
if (m_ownedSceneDrawBackend != nullptr) {
m_ownedSceneDrawBackend->Shutdown();
}
m_ownedSceneDrawBackend =
Rendering::Internal::CreateSceneDrawBackendFromAsset(
contextualPipelineBackendAsset);
m_ownedPipelineBackendAsset =
contextualPipelineBackendAsset;
sharedPipelineBackendAsset);
m_ownedSharedPipelineBackendAsset =
sharedPipelineBackendAsset;
}
return m_ownedSceneDrawBackend.get();
@@ -1952,7 +1941,7 @@ private:
std::vector<std::unique_ptr<Rendering::RenderPass>> m_fullscreenPassPool = {};
Rendering::SceneDrawBackend* m_boundSceneDrawBackend = nullptr;
std::shared_ptr<const Rendering::RenderPipelineAsset>
m_ownedPipelineBackendAsset = nullptr;
m_ownedSharedPipelineBackendAsset = nullptr;
std::unique_ptr<Rendering::SceneDrawBackend> m_ownedSceneDrawBackend =
nullptr;
};
@@ -2195,29 +2184,23 @@ bool MonoManagedRenderPipelineAssetRuntime::TryGetDefaultFinalColorSettings(
}
std::shared_ptr<const Rendering::RenderPipelineAsset>
MonoManagedRenderPipelineAssetRuntime::GetPipelineBackendAsset() const {
return GetPipelineBackendAsset(-1);
}
std::shared_ptr<const Rendering::RenderPipelineAsset>
MonoManagedRenderPipelineAssetRuntime::GetPipelineBackendAsset(
int32_t rendererIndex) const {
MonoManagedRenderPipelineAssetRuntime::GetSharedPipelineBackendAsset() const {
if (!SyncManagedAssetRuntimeState()) {
return nullptr;
}
if (m_pipelineBackendAssetResolved) {
return m_pipelineBackendAsset;
if (m_sharedPipelineBackendAssetResolved) {
return m_sharedPipelineBackendAsset;
}
if (GetManagedAssetObject() == nullptr) {
return nullptr;
}
m_pipelineBackendAssetResolved = true;
m_pipelineBackendAsset =
m_sharedPipelineBackendAssetResolved = true;
m_sharedPipelineBackendAsset =
Rendering::Internal::CreateDefaultPipelineBackendAsset();
return m_pipelineBackendAsset;
return m_sharedPipelineBackendAsset;
}
bool MonoManagedRenderPipelineAssetRuntime::UsesNativeCameraFramePlanBaseline()
@@ -2417,8 +2400,8 @@ bool MonoManagedRenderPipelineAssetRuntime::SyncManagedAssetRuntimeState() const
}
ReleaseManagedPipeline();
m_pipelineBackendAsset.reset();
m_pipelineBackendAssetResolved = false;
m_sharedPipelineBackendAsset.reset();
m_sharedPipelineBackendAssetResolved = false;
m_runtimeResourceVersion = runtimeResourceVersion;
return true;
}
@@ -2488,8 +2471,8 @@ void MonoManagedRenderPipelineAssetRuntime::ReleaseManagedAsset() const {
m_usesNativeCameraFramePlanBaselineContextualMethod = nullptr;
m_configureRenderSceneSetupMethod = nullptr;
m_configureDirectionalShadowExecutionStateMethod = nullptr;
m_pipelineBackendAsset.reset();
m_pipelineBackendAssetResolved = false;
m_sharedPipelineBackendAsset.reset();
m_sharedPipelineBackendAssetResolved = false;
m_runtimeResourceVersionResolved = false;
m_runtimeResourceVersion = 0;
const bool ownsManagedAssetHandle = m_ownsManagedAssetHandle;