Extract camera frame render-graph stage policy helpers

This commit is contained in:
2026-04-14 22:17:12 +08:00
parent a02ff65651
commit a67f8597ba
4 changed files with 257 additions and 103 deletions

View File

@@ -0,0 +1,100 @@
#pragma once
#include <XCEngine/Rendering/Execution/CameraFrameRenderGraphResources.h>
#include <XCEngine/Rendering/RenderSurface.h>
namespace XCEngine {
namespace Rendering {
struct CameraFrameRenderGraphSourceBinding {
const RenderSurface* sourceSurfaceTemplate = nullptr;
RHI::RHIResourceView* sourceColorView = nullptr;
RHI::ResourceStates sourceColorState = RHI::ResourceStates::Common;
RenderGraphTextureHandle sourceColor = {};
};
inline bool IsCameraFrameFullscreenSequenceStage(
CameraFrameStage stage) {
return stage == CameraFrameStage::PostProcess ||
stage == CameraFrameStage::FinalOutput;
}
inline bool DoesCameraFrameStageGraphOwnColorTransitions(
CameraFrameStage stage) {
return stage == CameraFrameStage::MainScene ||
stage == CameraFrameStage::PostProcess ||
stage == CameraFrameStage::FinalOutput ||
stage == CameraFrameStage::ObjectId;
}
inline bool DoesCameraFrameStageGraphOwnDepthTransitions(
CameraFrameStage stage) {
return stage == CameraFrameStage::ShadowCaster ||
stage == CameraFrameStage::DepthOnly ||
stage == CameraFrameStage::MainScene ||
stage == CameraFrameStage::ObjectId;
}
inline bool UsesCameraFrameStageGraphManagedOutputColor(
const CameraFramePlan& plan,
CameraFrameStage stage) {
switch (stage) {
case CameraFrameStage::MainScene:
return plan.usesGraphManagedMainSceneColor;
case CameraFrameStage::PostProcess:
return plan.usesGraphManagedPostProcessColor;
default:
return false;
}
}
inline CameraFrameColorSource ResolveCameraFrameStageGraphManagedColorSource(
const CameraFramePlan& plan,
CameraFrameStage stage) {
switch (stage) {
case CameraFrameStage::PostProcess:
return plan.postProcessSource;
case CameraFrameStage::FinalOutput:
return plan.finalOutputSource;
default:
return CameraFrameColorSource::ExplicitSurface;
}
}
inline CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding(
const CameraFramePlan& plan,
CameraFrameStage stage,
const RenderSurface& stageSurfaceTemplate,
const RenderSurface* explicitSourceSurfaceTemplate,
RHI::RHIResourceView* explicitSourceColorView,
RHI::ResourceStates explicitSourceColorState,
RenderGraphTextureHandle explicitSourceColor,
const RenderGraphBlackboard* blackboard) {
CameraFrameRenderGraphSourceBinding binding = {};
binding.sourceSurfaceTemplate = explicitSourceSurfaceTemplate;
binding.sourceColorView = explicitSourceColorView;
binding.sourceColorState = explicitSourceColorState;
binding.sourceColor = explicitSourceColor;
const CameraFrameColorSource graphManagedSource =
ResolveCameraFrameStageGraphManagedColorSource(plan, stage);
if (graphManagedSource != CameraFrameColorSource::ExplicitSurface) {
binding.sourceSurfaceTemplate = &stageSurfaceTemplate;
binding.sourceColorView = nullptr;
binding.sourceColorState = RHI::ResourceStates::PixelShaderResource;
binding.sourceColor =
ResolveCameraFrameRenderGraphColorSource(
blackboard,
graphManagedSource);
}
if (binding.sourceSurfaceTemplate == nullptr &&
binding.sourceColor.IsValid()) {
binding.sourceSurfaceTemplate = &stageSurfaceTemplate;
}
return binding;
}
} // namespace Rendering
} // namespace XCEngine