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

View File

@@ -13,28 +13,6 @@ struct CameraFrameRenderGraphSourceBinding {
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) {

View File

@@ -45,3 +45,44 @@ TEST(CameraFrameRenderGraphFrameData_Test, ResolvesColorSourceFromBlackboardFram
.index,
19u);
}
TEST(CameraFrameRenderGraphFrameData_Test, ResolvesStageSurfaceResourcesThroughCentralSlotPolicy) {
CameraFrameRenderGraphResources frameResources = {};
EXPECT_EQ(
ResolveCameraFrameRenderGraphStageSurfaceResources(
frameResources,
CameraFrameStage::MainScene),
&frameResources.mainScene);
EXPECT_EQ(
ResolveCameraFrameRenderGraphStageSurfaceResources(
frameResources,
CameraFrameStage::PostProcess),
&frameResources.postProcess);
EXPECT_EQ(
ResolveCameraFrameRenderGraphStageSurfaceResources(
frameResources,
CameraFrameStage::ObjectId),
&frameResources.objectId);
EXPECT_EQ(
ResolveCameraFrameRenderGraphStageSurfaceResources(
frameResources,
CameraFrameStage::FinalOutput),
nullptr);
WriteCameraFrameRenderGraphStageSurfaceResources(
frameResources,
CameraFrameStage::PostProcess,
RenderGraphTextureHandle{ 23u },
RenderGraphTextureHandle{ 29u });
WriteCameraFrameRenderGraphStageSurfaceResources(
frameResources,
CameraFrameStage::FinalOutput,
RenderGraphTextureHandle{ 31u },
RenderGraphTextureHandle{ 37u });
EXPECT_EQ(frameResources.postProcess.color.index, 23u);
EXPECT_EQ(frameResources.postProcess.depth.index, 29u);
EXPECT_FALSE(frameResources.mainScene.color.IsValid());
EXPECT_FALSE(frameResources.objectId.color.IsValid());
}

View File

@@ -11,6 +11,18 @@ TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsStageFullscreenAndTransition
EXPECT_TRUE(IsCameraFrameSequenceStage(CameraFrameStage::PreScenePasses));
EXPECT_TRUE(IsCameraFrameSequenceStage(CameraFrameStage::OverlayPasses));
EXPECT_FALSE(IsCameraFrameSequenceStage(CameraFrameStage::MainScene));
EXPECT_EQ(
GetCameraFrameStageSurfaceResourceSlot(CameraFrameStage::MainScene),
CameraFrameStageSurfaceResourceSlot::MainScene);
EXPECT_EQ(
GetCameraFrameStageSurfaceResourceSlot(CameraFrameStage::PostProcess),
CameraFrameStageSurfaceResourceSlot::PostProcess);
EXPECT_EQ(
GetCameraFrameStageSurfaceResourceSlot(CameraFrameStage::ObjectId),
CameraFrameStageSurfaceResourceSlot::ObjectId);
EXPECT_EQ(
GetCameraFrameStageSurfaceResourceSlot(CameraFrameStage::FinalOutput),
CameraFrameStageSurfaceResourceSlot::None);
EXPECT_EQ(
GetCameraFrameStageExecutionKind(CameraFrameStage::PostProcess),