Tighten URP pass queue snapshot ownership
This commit is contained in:
@@ -1,10 +1,28 @@
|
||||
#include <XCEngine/Rendering/Execution/CameraFramePlan.h>
|
||||
|
||||
#include <atomic>
|
||||
|
||||
namespace XCEngine {
|
||||
namespace Rendering {
|
||||
|
||||
namespace {
|
||||
|
||||
uint64_t AllocateCameraFramePlanId() {
|
||||
static std::atomic<uint64_t> s_nextFramePlanId{ 1u };
|
||||
uint64_t framePlanId =
|
||||
s_nextFramePlanId.fetch_add(
|
||||
1u,
|
||||
std::memory_order_relaxed);
|
||||
if (framePlanId == 0u) {
|
||||
framePlanId =
|
||||
s_nextFramePlanId.fetch_add(
|
||||
1u,
|
||||
std::memory_order_relaxed);
|
||||
}
|
||||
|
||||
return framePlanId;
|
||||
}
|
||||
|
||||
CameraFrameFullscreenStagePlan* GetMutableFullscreenStagePlan(
|
||||
CameraFramePlan& plan,
|
||||
CameraFrameStage stage) {
|
||||
@@ -59,6 +77,7 @@ RenderSurface CameraFramePlan::BuildCameraDepthOnlySurfaceTemplate(
|
||||
|
||||
CameraFramePlan CameraFramePlan::FromRequest(const CameraRenderRequest& request) {
|
||||
CameraFramePlan plan = {};
|
||||
plan.framePlanId = AllocateCameraFramePlanId();
|
||||
plan.request = request;
|
||||
plan.shadowCaster = request.shadowCaster;
|
||||
plan.directionalShadow = request.directionalShadow;
|
||||
|
||||
@@ -49,7 +49,8 @@ RenderPipelineStageSupportContext BuildStageSupportContext(
|
||||
CameraFrameStage stage) {
|
||||
return RenderPipelineStageSupportContext{
|
||||
stage,
|
||||
plan.request.rendererIndex };
|
||||
plan.request.rendererIndex,
|
||||
plan.framePlanId };
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -18,7 +18,8 @@ RenderPipelineStageSupportContext BuildStageSupportContext(
|
||||
CameraFrameStage stage) {
|
||||
return RenderPipelineStageSupportContext{
|
||||
stage,
|
||||
context.plan.request.rendererIndex };
|
||||
context.plan.request.rendererIndex,
|
||||
context.plan.framePlanId };
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
@@ -603,6 +603,8 @@ RenderPipelineStageRenderGraphContext BuildCameraFramePipelineStageRenderGraphCo
|
||||
context.plan.directionalShadow;
|
||||
pipelineContext.rendererIndex =
|
||||
context.plan.request.rendererIndex;
|
||||
pipelineContext.framePlanId =
|
||||
context.plan.framePlanId;
|
||||
return pipelineContext;
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,8 @@ RenderPipelineStageSupportContext BuildStageSupportContext(
|
||||
const CameraFrameRenderGraphStageContext& context) {
|
||||
return RenderPipelineStageSupportContext{
|
||||
stageState.stage,
|
||||
context.plan.request.rendererIndex };
|
||||
context.plan.request.rendererIndex,
|
||||
context.plan.framePlanId };
|
||||
}
|
||||
|
||||
bool AllowsCameraFrameStageFallback(
|
||||
|
||||
@@ -437,6 +437,10 @@ NativeSceneRecorder::BuildGraphContext() const {
|
||||
m_context.usesGraphManagedOutputColor;
|
||||
context.directionalShadowPlan =
|
||||
m_context.directionalShadowPlan;
|
||||
context.rendererIndex =
|
||||
m_context.rendererIndex;
|
||||
context.framePlanId =
|
||||
m_context.framePlanId;
|
||||
return context;
|
||||
}
|
||||
|
||||
|
||||
@@ -145,7 +145,8 @@ bool ScriptableRenderPipelineHost::RecordStageRenderGraph(
|
||||
if (m_stageRecorder != nullptr) {
|
||||
const RenderPipelineStageSupportContext supportContext = {
|
||||
context.stage,
|
||||
context.rendererIndex };
|
||||
context.rendererIndex,
|
||||
context.framePlanId };
|
||||
return m_stageRecorder->SupportsStageRenderGraph(supportContext) &&
|
||||
m_stageRecorder->RecordStageRenderGraph(context);
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user