refactor(rendering): centralize camera frame stage graph policy

This commit is contained in:
2026-04-15 15:28:15 +08:00
parent 1ad3bfc702
commit 3afe44d2fa
5 changed files with 139 additions and 43 deletions

View File

@@ -18,48 +18,71 @@ struct CameraFrameRenderGraphResources {
RenderGraphTextureHandle mainDirectionalShadow = {};
};
inline CameraFrameRenderGraphSurfaceResources* ResolveCameraFrameRenderGraphStageSurfaceResources(
inline CameraFrameRenderGraphSurfaceResources* ResolveCameraFrameRenderGraphSurfaceResources(
CameraFrameRenderGraphResources& frameResources,
CameraFrameStage stage) {
switch (stage) {
case CameraFrameStage::MainScene:
CameraFrameStageSurfaceResourceSlot slot) {
switch (slot) {
case CameraFrameStageSurfaceResourceSlot::MainScene:
return &frameResources.mainScene;
case CameraFrameStage::PostProcess:
case CameraFrameStageSurfaceResourceSlot::PostProcess:
return &frameResources.postProcess;
case CameraFrameStage::ObjectId:
case CameraFrameStageSurfaceResourceSlot::ObjectId:
return &frameResources.objectId;
default:
return nullptr;
}
}
inline const CameraFrameRenderGraphSurfaceResources* ResolveCameraFrameRenderGraphStageSurfaceResources(
inline const CameraFrameRenderGraphSurfaceResources* ResolveCameraFrameRenderGraphSurfaceResources(
const CameraFrameRenderGraphResources& frameResources,
CameraFrameStage stage) {
switch (stage) {
case CameraFrameStage::MainScene:
CameraFrameStageSurfaceResourceSlot slot) {
switch (slot) {
case CameraFrameStageSurfaceResourceSlot::MainScene:
return &frameResources.mainScene;
case CameraFrameStage::PostProcess:
case CameraFrameStageSurfaceResourceSlot::PostProcess:
return &frameResources.postProcess;
case CameraFrameStage::ObjectId:
case CameraFrameStageSurfaceResourceSlot::ObjectId:
return &frameResources.objectId;
default:
return nullptr;
}
}
inline CameraFrameRenderGraphSurfaceResources* ResolveCameraFrameRenderGraphStageSurfaceResources(
CameraFrameRenderGraphResources& frameResources,
CameraFrameStage stage) {
return ResolveCameraFrameRenderGraphSurfaceResources(
frameResources,
GetCameraFrameStageSurfaceResourceSlot(stage));
}
inline const CameraFrameRenderGraphSurfaceResources* ResolveCameraFrameRenderGraphStageSurfaceResources(
const CameraFrameRenderGraphResources& frameResources,
CameraFrameStage stage) {
return ResolveCameraFrameRenderGraphSurfaceResources(
frameResources,
GetCameraFrameStageSurfaceResourceSlot(stage));
}
inline constexpr CameraFrameStageSurfaceResourceSlot
ResolveCameraFrameColorSourceSurfaceResourceSlot(
CameraFrameColorSource source) {
switch (source) {
case CameraFrameColorSource::MainSceneColor:
return CameraFrameStageSurfaceResourceSlot::MainScene;
case CameraFrameColorSource::PostProcessColor:
return CameraFrameStageSurfaceResourceSlot::PostProcess;
default:
return CameraFrameStageSurfaceResourceSlot::None;
}
}
inline const CameraFrameRenderGraphSurfaceResources* ResolveCameraFrameRenderGraphColorSourceResources(
const CameraFrameRenderGraphResources& frameResources,
CameraFrameColorSource source) {
switch (source) {
case CameraFrameColorSource::MainSceneColor:
return &frameResources.mainScene;
case CameraFrameColorSource::PostProcessColor:
return &frameResources.postProcess;
case CameraFrameColorSource::ExplicitSurface:
default:
return nullptr;
}
return ResolveCameraFrameRenderGraphSurfaceResources(
frameResources,
ResolveCameraFrameColorSourceSurfaceResourceSlot(source));
}
inline RenderGraphTextureHandle ResolveCameraFrameRenderGraphColorSource(

View File

@@ -32,6 +32,13 @@ enum class CameraFrameStageRequestKind : uint8_t {
ObjectId
};
enum class CameraFrameStageSurfaceResourceSlot : uint8_t {
None,
MainScene,
PostProcess,
ObjectId
};
struct CameraFrameStageInfo {
CameraFrameStage stage = CameraFrameStage::MainScene;
const char* name = "";
@@ -93,6 +100,11 @@ inline constexpr bool IsCameraFrameSequenceStage(CameraFrameStage stage) {
CameraFrameStageExecutionKind::Sequence;
}
inline constexpr bool IsCameraFrameFullscreenSequenceStage(CameraFrameStage stage) {
return stage == CameraFrameStage::PostProcess ||
stage == CameraFrameStage::FinalOutput;
}
inline constexpr bool SupportsCameraFrameStandalonePass(CameraFrameStage stage) {
return GetCameraFrameStageExecutionKind(stage) ==
CameraFrameStageExecutionKind::StandalonePass;
@@ -130,5 +142,35 @@ inline constexpr const char* GetCameraFrameStageName(CameraFrameStage stage) {
}
}
inline constexpr bool DoesCameraFrameStageGraphOwnColorTransitions(
CameraFrameStage stage) {
return stage == CameraFrameStage::MainScene ||
stage == CameraFrameStage::PostProcess ||
stage == CameraFrameStage::FinalOutput ||
stage == CameraFrameStage::ObjectId;
}
inline constexpr bool DoesCameraFrameStageGraphOwnDepthTransitions(
CameraFrameStage stage) {
return stage == CameraFrameStage::ShadowCaster ||
stage == CameraFrameStage::DepthOnly ||
stage == CameraFrameStage::MainScene ||
stage == CameraFrameStage::ObjectId;
}
inline constexpr CameraFrameStageSurfaceResourceSlot
GetCameraFrameStageSurfaceResourceSlot(CameraFrameStage stage) {
switch (stage) {
case CameraFrameStage::MainScene:
return CameraFrameStageSurfaceResourceSlot::MainScene;
case CameraFrameStage::PostProcess:
return CameraFrameStageSurfaceResourceSlot::PostProcess;
case CameraFrameStage::ObjectId:
return CameraFrameStageSurfaceResourceSlot::ObjectId;
default:
return CameraFrameStageSurfaceResourceSlot::None;
}
}
} // namespace Rendering
} // namespace XCEngine