Tighten URP pass queue snapshot ownership

This commit is contained in:
2026-04-27 15:21:57 +08:00
parent c0b829cd6a
commit 66d968c3ce
22 changed files with 849 additions and 51 deletions

View File

@@ -1796,6 +1796,7 @@ public:
m_ownedSceneDrawBackend->Shutdown();
}
m_ownedSharedPipelineBackendAsset.reset();
m_supportsStageContextualWithFramePlanMethod = nullptr;
m_supportsStageContextualMethod = nullptr;
m_supportsStageMethod = nullptr;
m_recordStageMethod = nullptr;
@@ -1813,7 +1814,8 @@ public:
return SupportsStageRenderGraph(
Rendering::RenderPipelineStageSupportContext{
stage,
-1 });
-1,
0u });
}
bool SupportsStageRenderGraph(
@@ -1828,6 +1830,36 @@ public:
return false;
}
MonoMethod* const contextualWithFramePlanMethod =
ResolveSupportsStageContextualWithFramePlanMethod(
pipelineObject);
if (contextualWithFramePlanMethod != nullptr) {
int32_t managedStage =
static_cast<int32_t>(context.stage);
int32_t rendererIndex =
context.rendererIndex;
uint64_t framePlanId =
context.framePlanId;
void* args[3] = {
&managedStage,
&rendererIndex,
&framePlanId };
MonoObject* result = nullptr;
if (!m_runtime->InvokeManagedMethod(
pipelineObject,
contextualWithFramePlanMethod,
args,
&result)) {
return false;
}
bool supportsStage = false;
return TryUnboxManagedBoolean(
result,
supportsStage) &&
supportsStage;
}
MonoMethod* const contextualMethod =
ResolveSupportsStageContextualMethod(
pipelineObject);
@@ -1964,6 +1996,7 @@ private:
}
if (pipelineHandle != m_resolvedPipelineHandle) {
m_supportsStageContextualWithFramePlanMethod = nullptr;
m_supportsStageContextualMethod = nullptr;
m_supportsStageMethod = nullptr;
m_recordStageMethod = nullptr;
@@ -1973,6 +2006,19 @@ private:
return m_runtime->GetManagedObject(pipelineHandle);
}
MonoMethod* ResolveSupportsStageContextualWithFramePlanMethod(
MonoObject* pipelineObject) const {
if (m_supportsStageContextualWithFramePlanMethod == nullptr) {
m_supportsStageContextualWithFramePlanMethod =
m_runtime->ResolveManagedMethod(
pipelineObject,
"SupportsStageRenderGraphContextual",
3);
}
return m_supportsStageContextualWithFramePlanMethod;
}
MonoMethod* ResolveSupportsStageContextualMethod(
MonoObject* pipelineObject) const {
if (m_supportsStageContextualMethod == nullptr) {
@@ -2159,6 +2205,7 @@ private:
std::shared_ptr<const MonoManagedRenderPipelineAssetRuntime> m_assetRuntime;
MonoScriptRuntime* m_runtime = nullptr;
mutable MonoMethod* m_supportsStageContextualWithFramePlanMethod = nullptr;
mutable MonoMethod* m_supportsStageContextualMethod = nullptr;
mutable MonoMethod* m_supportsStageMethod = nullptr;
mutable MonoMethod* m_recordStageMethod = nullptr;
@@ -4703,6 +4750,16 @@ int32_t InternalCall_Rendering_ScriptableRenderContext_GetRendererIndex(
: -1;
}
uint64_t InternalCall_Rendering_ScriptableRenderContext_GetFramePlanId(
uint64_t nativeHandle) {
const ManagedScriptableRenderContextState* const state =
FindManagedScriptableRenderContextState(nativeHandle);
return state != nullptr &&
state->graphContext != nullptr
? state->graphContext->framePlanId
: 0u;
}
int32_t InternalCall_Rendering_ScriptableRenderContext_GetSourceColorTextureHandle(
uint64_t nativeHandle) {
const ManagedScriptableRenderContextState* const state =
@@ -6235,6 +6292,17 @@ InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetRendererIndex(
: -1;
}
uint64_t
InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetFramePlanId(
uint64_t nativeHandle) {
const ManagedScriptableRenderPipelinePlanningContextState* const state =
FindManagedScriptableRenderPipelinePlanningContextState(nativeHandle);
return state != nullptr &&
state->plan != nullptr
? state->plan->framePlanId
: 0u;
}
mono_bool
InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested(
uint64_t nativeHandle,
@@ -6597,6 +6665,7 @@ void RegisterInternalCalls() {
mono_add_internal_call("XCEngine.InternalCalls::Rendering_GetRenderPipelineAsset", reinterpret_cast<const void*>(&InternalCall_Rendering_GetRenderPipelineAsset));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetStage", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetStage));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetRendererIndex", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetRendererIndex));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetFramePlanId", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetFramePlanId));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetSourceColorTextureHandle", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetSourceColorTextureHandle));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetPrimaryColorTargetHandle", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetPrimaryColorTargetHandle));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_GetDepthTargetHandle", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_GetDepthTargetHandle));
@@ -6668,6 +6737,7 @@ void RegisterInternalCalls() {
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_RecordScenePhase", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_RecordScenePhase));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderContext_DrawRenderersByDesc", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderContext_DrawRenderersByDesc));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetRendererIndex", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetRendererIndex));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetFramePlanId", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetFramePlanId));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_IsStageRequested));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetStageColorSource", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetStageColorSource));
mono_add_internal_call("XCEngine.InternalCalls::Rendering_ScriptableRenderPipelinePlanningContext_GetStageUsesGraphManagedOutputColor", reinterpret_cast<const void*>(&InternalCall_Rendering_ScriptableRenderPipelinePlanningContext_GetStageUsesGraphManagedOutputColor));