refactor(srp): add asset runtime invalidation seam
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user