Align rendering orchestration with camera stack plans

This commit is contained in:
2026-04-28 02:42:42 +08:00
parent be0d244372
commit 3bc0cfcf08
20 changed files with 616 additions and 13 deletions

View File

@@ -12,6 +12,7 @@
#include "Physics/PhysicsWorld.h"
#include "Rendering/Caches/DirectionalShadowSurfaceCache.h"
#include "Rendering/Execution/CameraFramePlan.h"
#include "Rendering/Execution/CameraStackFramePlan.h"
#include "Rendering/Execution/DirectionalShadowExecutionState.h"
#include "Rendering/Execution/CameraFrameRenderGraphFrameData.h"
#include "Rendering/Execution/Internal/CameraFrameGraph/SurfaceUtils.h"
@@ -2134,6 +2135,7 @@ public:
m_supportsStageContextualMethod = nullptr;
m_supportsStageMethod = nullptr;
m_recordStageMethod = nullptr;
m_finishCameraStackRenderingMethod = nullptr;
m_resolvedPipelineHandle = 0;
m_boundSceneDrawBackend = nullptr;
}
@@ -2322,6 +2324,35 @@ public:
return flushed;
}
void FinishCameraStackRendering(
const Rendering::CameraStackFramePlan& stackPlan) override {
if (!IsRuntimeAlive()) {
return;
}
MonoObject* const pipelineObject = GetManagedPipelineObject();
MonoMethod* const method =
ResolveFinishCameraStackRenderingMethod(pipelineObject);
if (pipelineObject == nullptr ||
method == nullptr) {
return;
}
for (const Rendering::CameraFramePlan& plan :
stackPlan.cameraPlans) {
int32_t rendererIndex = plan.request.rendererIndex;
uint64_t framePlanId = plan.framePlanId;
void* args[2] = {
&rendererIndex,
&framePlanId };
m_runtime->InvokeManagedMethod(
pipelineObject,
method,
args,
nullptr);
}
}
private:
struct ManagedRenderFuncExecutionState {
std::shared_ptr<const MonoManagedRenderPipelineAssetRuntime>
@@ -2415,6 +2446,7 @@ private:
m_supportsStageContextualMethod = nullptr;
m_supportsStageMethod = nullptr;
m_recordStageMethod = nullptr;
m_finishCameraStackRenderingMethod = nullptr;
m_resolvedPipelineHandle = pipelineHandle;
}
@@ -2471,6 +2503,19 @@ private:
return m_recordStageMethod;
}
MonoMethod* ResolveFinishCameraStackRenderingMethod(
MonoObject* pipelineObject) const {
if (m_finishCameraStackRenderingMethod == nullptr) {
m_finishCameraStackRenderingMethod =
m_runtime->ResolveManagedMethod(
pipelineObject,
"FinishCameraStackRenderingInstance",
2);
}
return m_finishCameraStackRenderingMethod;
}
bool FlushManagedRasterPasses(
const Rendering::RenderPipelineStageRenderGraphContext& context,
ManagedScriptableRenderContextState& managedContextState) {
@@ -2653,6 +2698,7 @@ private:
mutable MonoMethod* m_supportsStageContextualMethod = nullptr;
mutable MonoMethod* m_supportsStageMethod = nullptr;
mutable MonoMethod* m_recordStageMethod = nullptr;
mutable MonoMethod* m_finishCameraStackRenderingMethod = nullptr;
mutable uint32_t m_resolvedPipelineHandle = 0;
std::vector<std::unique_ptr<Rendering::RenderPass>> m_fullscreenPassPool = {};
Rendering::SceneDrawBackend* m_boundSceneDrawBackend = nullptr;