refactor(srp): add asset runtime invalidation seam

This commit is contained in:
2026-04-20 03:06:04 +08:00
parent d196ec9264
commit 59f2249e07
6 changed files with 554 additions and 14 deletions

View File

@@ -656,6 +656,21 @@ bool TryUnboxManagedBoolean(MonoObject* boxedValue, bool& outValue) {
return true;
}
bool TryUnboxManagedInt32(MonoObject* boxedValue, int32_t& outValue) {
outValue = 0;
if (!boxedValue) {
return false;
}
void* const rawValue = mono_object_unbox(boxedValue);
if (!rawValue) {
return false;
}
outValue = *static_cast<int32_t*>(rawValue);
return true;
}
struct ManagedFinalColorSettingsData {
uint8_t outputTransferMode = 0;
uint8_t exposureMode = 0;
@@ -828,6 +843,8 @@ public:
private:
bool EnsureManagedAsset() const;
bool SyncManagedAssetRuntimeState() const;
bool TryGetManagedRuntimeResourceVersion(int32_t& outVersion) const;
void ReleaseManagedPipeline() const;
void ReleaseManagedAsset() const;
MonoObject* GetManagedAssetObject() const;
@@ -839,6 +856,8 @@ private:
MonoObject* assetObject) const;
MonoMethod* ResolveGetDefaultFinalColorSettingsMethod(
MonoObject* assetObject) const;
MonoMethod* ResolveGetRuntimeResourceVersionMethod(
MonoObject* assetObject) const;
MonoMethod* ResolveGetPipelineRendererAssetKeyMethod(
MonoObject* assetObject) const;
MonoMethod* ResolveReleaseRuntimeResourcesMethod(
@@ -853,10 +872,13 @@ private:
mutable MonoMethod* m_configureCameraRenderRequestMethod = nullptr;
mutable MonoMethod* m_configureCameraFramePlanMethod = nullptr;
mutable MonoMethod* m_getDefaultFinalColorSettingsMethod = nullptr;
mutable MonoMethod* m_getRuntimeResourceVersionMethod = nullptr;
mutable MonoMethod* m_getPipelineRendererAssetKeyMethod = nullptr;
mutable MonoMethod* m_releaseRuntimeResourcesMethod = nullptr;
mutable bool m_ownsManagedAssetHandle = false;
mutable bool m_assetCreationAttempted = false;
mutable bool m_runtimeResourceVersionResolved = false;
mutable int32_t m_runtimeResourceVersion = 0;
mutable uint32_t m_pipelineHandle = 0;
mutable bool m_pipelineCreationAttempted = false;
mutable bool m_pipelineRendererAssetResolved = false;
@@ -895,8 +917,10 @@ public:
if (m_ownedSceneRenderer != nullptr) {
m_ownedSceneRenderer->Shutdown();
}
m_ownedPipelineRendererAsset.reset();
m_supportsStageMethod = nullptr;
m_recordStageMethod = nullptr;
m_resolvedPipelineHandle = 0;
m_boundSceneRenderer = nullptr;
}
@@ -1006,6 +1030,12 @@ private:
return nullptr;
}
if (pipelineHandle != m_resolvedPipelineHandle) {
m_supportsStageMethod = nullptr;
m_recordStageMethod = nullptr;
m_resolvedPipelineHandle = pipelineHandle;
}
return m_runtime->GetManagedObject(pipelineHandle);
}
@@ -1070,15 +1100,20 @@ private:
return m_boundSceneRenderer;
}
if (m_ownedSceneRenderer == nullptr) {
const std::shared_ptr<const Rendering::RenderPipelineAsset>
pipelineRendererAsset =
m_assetRuntime != nullptr
? m_assetRuntime->GetPipelineRendererAsset()
: nullptr;
const std::shared_ptr<const Rendering::RenderPipelineAsset>
pipelineRendererAsset =
m_assetRuntime != nullptr
? m_assetRuntime->GetPipelineRendererAsset()
: nullptr;
if (m_ownedSceneRenderer == nullptr ||
pipelineRendererAsset != m_ownedPipelineRendererAsset) {
if (m_ownedSceneRenderer != nullptr) {
m_ownedSceneRenderer->Shutdown();
}
m_ownedSceneRenderer =
Rendering::Internal::CreateNativeSceneRendererFromAsset(
pipelineRendererAsset);
m_ownedPipelineRendererAsset = pipelineRendererAsset;
}
return m_ownedSceneRenderer.get();
@@ -1088,8 +1123,11 @@ private:
MonoScriptRuntime* m_runtime = nullptr;
mutable MonoMethod* m_supportsStageMethod = nullptr;
mutable MonoMethod* m_recordStageMethod = nullptr;
mutable uint32_t m_resolvedPipelineHandle = 0;
std::vector<std::unique_ptr<Rendering::RenderPass>> m_fullscreenPassPool = {};
Rendering::NativeSceneRenderer* m_boundSceneRenderer = nullptr;
std::shared_ptr<const Rendering::RenderPipelineAsset>
m_ownedPipelineRendererAsset = nullptr;
std::unique_ptr<Rendering::NativeSceneRenderer> m_ownedSceneRenderer =
nullptr;
};
@@ -1217,16 +1255,16 @@ bool MonoManagedRenderPipelineAssetRuntime::TryGetDefaultFinalColorSettings(
std::shared_ptr<const Rendering::RenderPipelineAsset>
MonoManagedRenderPipelineAssetRuntime::GetPipelineRendererAsset() const {
if (!SyncManagedAssetRuntimeState()) {
return nullptr;
}
if (m_pipelineRendererAssetResolved) {
return m_pipelineRendererAsset;
}
m_pipelineRendererAssetResolved = true;
m_pipelineRendererAsset.reset();
if (!EnsureManagedAsset()) {
return nullptr;
}
MonoObject* const assetObject = GetManagedAssetObject();
MonoMethod* const method =
ResolveGetPipelineRendererAssetKeyMethod(assetObject);
@@ -1257,6 +1295,11 @@ MonoManagedRenderPipelineAssetRuntime::GetPipelineRendererAsset() const {
bool MonoManagedRenderPipelineAssetRuntime::AcquireManagedPipelineHandle(
uint32_t& outPipelineHandle) const {
if (!SyncManagedAssetRuntimeState()) {
outPipelineHandle = 0;
return false;
}
if (m_pipelineHandle != 0) {
outPipelineHandle = m_pipelineHandle;
return true;
@@ -1265,10 +1308,6 @@ bool MonoManagedRenderPipelineAssetRuntime::AcquireManagedPipelineHandle(
outPipelineHandle = 0;
return false;
}
if (!EnsureManagedAsset()) {
outPipelineHandle = 0;
return false;
}
m_pipelineCreationAttempted = true;
@@ -1370,6 +1409,59 @@ bool MonoManagedRenderPipelineAssetRuntime::EnsureManagedAsset() const {
return m_ownsManagedAssetHandle;
}
bool MonoManagedRenderPipelineAssetRuntime::SyncManagedAssetRuntimeState() const {
if (!EnsureManagedAsset()) {
return false;
}
int32_t runtimeResourceVersion = 0;
if (!TryGetManagedRuntimeResourceVersion(runtimeResourceVersion)) {
return false;
}
if (!m_runtimeResourceVersionResolved) {
m_runtimeResourceVersion = runtimeResourceVersion;
m_runtimeResourceVersionResolved = true;
return true;
}
if (runtimeResourceVersion == m_runtimeResourceVersion) {
return true;
}
ReleaseManagedPipeline();
m_pipelineRendererAsset.reset();
m_pipelineRendererAssetResolved = false;
m_runtimeResourceVersion = runtimeResourceVersion;
return true;
}
bool MonoManagedRenderPipelineAssetRuntime::TryGetManagedRuntimeResourceVersion(
int32_t& outVersion) const {
outVersion = 0;
if (!EnsureManagedAsset()) {
return false;
}
MonoObject* const assetObject = GetManagedAssetObject();
MonoMethod* const method =
ResolveGetRuntimeResourceVersionMethod(assetObject);
if (assetObject == nullptr || method == nullptr) {
return false;
}
MonoObject* managedVersion = nullptr;
if (!m_runtime->InvokeManagedMethod(
assetObject,
method,
nullptr,
&managedVersion)) {
return false;
}
return TryUnboxManagedInt32(managedVersion, outVersion);
}
void MonoManagedRenderPipelineAssetRuntime::ReleaseManagedPipeline() const {
m_pipelineCreationAttempted = false;
m_disposePipelineMethod = nullptr;
@@ -1404,9 +1496,12 @@ void MonoManagedRenderPipelineAssetRuntime::ReleaseManagedAsset() const {
m_configureCameraRenderRequestMethod = nullptr;
m_configureCameraFramePlanMethod = nullptr;
m_getDefaultFinalColorSettingsMethod = nullptr;
m_getRuntimeResourceVersionMethod = nullptr;
m_getPipelineRendererAssetKeyMethod = nullptr;
m_pipelineRendererAsset.reset();
m_pipelineRendererAssetResolved = false;
m_runtimeResourceVersionResolved = false;
m_runtimeResourceVersion = 0;
const bool ownsManagedAssetHandle = m_ownsManagedAssetHandle;
m_ownsManagedAssetHandle = false;
m_assetCreationAttempted = false;
@@ -1508,6 +1603,20 @@ MonoManagedRenderPipelineAssetRuntime::ResolveGetDefaultFinalColorSettingsMethod
return m_getDefaultFinalColorSettingsMethod;
}
MonoMethod*
MonoManagedRenderPipelineAssetRuntime::ResolveGetRuntimeResourceVersionMethod(
MonoObject* assetObject) const {
if (m_getRuntimeResourceVersionMethod == nullptr) {
m_getRuntimeResourceVersionMethod =
m_runtime->ResolveManagedMethod(
assetObject,
"GetRuntimeResourceVersionInstance",
0);
}
return m_getRuntimeResourceVersionMethod;
}
MonoMethod*
MonoManagedRenderPipelineAssetRuntime::ResolveGetPipelineRendererAssetKeyMethod(
MonoObject* assetObject) const {