refactor(rendering): centralize stage graph output policies
This commit is contained in:
@@ -45,6 +45,11 @@ enum class CameraFrameStageSharedSurfaceRole : uint8_t {
|
||||
FinalComposited
|
||||
};
|
||||
|
||||
enum class CameraFrameStagePublishedDepthAliasRole : uint8_t {
|
||||
None,
|
||||
MainDirectionalShadow
|
||||
};
|
||||
|
||||
struct CameraFrameStageInfo {
|
||||
CameraFrameStage stage = CameraFrameStage::MainScene;
|
||||
const char* name = "";
|
||||
@@ -198,6 +203,16 @@ GetCameraFrameStageSharedOutputSurfaceRole(CameraFrameStage stage) {
|
||||
}
|
||||
}
|
||||
|
||||
inline constexpr CameraFrameStagePublishedDepthAliasRole
|
||||
GetCameraFrameStagePublishedDepthAliasRole(CameraFrameStage stage) {
|
||||
switch (stage) {
|
||||
case CameraFrameStage::ShadowCaster:
|
||||
return CameraFrameStagePublishedDepthAliasRole::MainDirectionalShadow;
|
||||
default:
|
||||
return CameraFrameStagePublishedDepthAliasRole::None;
|
||||
}
|
||||
}
|
||||
|
||||
inline constexpr bool DoesCameraFrameStageFallbackUseColorOnlySurfaceAccess(
|
||||
CameraFrameStage stage) {
|
||||
return IsCameraFrameFullscreenSequenceStage(stage);
|
||||
|
||||
@@ -41,6 +41,10 @@ bool CameraFramePlan::UsesGraphManagedMainSceneColor() const {
|
||||
}
|
||||
|
||||
bool CameraFramePlan::UsesGraphManagedOutputColor(CameraFrameStage stage) const {
|
||||
if (stage == CameraFrameStage::MainScene) {
|
||||
return UsesGraphManagedMainSceneColor();
|
||||
}
|
||||
|
||||
if (const CameraFrameFullscreenStagePlan* fullscreenStagePlan =
|
||||
GetFullscreenStagePlan(stage);
|
||||
fullscreenStagePlan != nullptr) {
|
||||
|
||||
@@ -108,6 +108,23 @@ RenderGraphSurfaceAccessMode BuildCameraFrameStageFallbackSurfaceAccessMode(
|
||||
: RenderGraphSurfaceAccessMode::ColorDepth;
|
||||
}
|
||||
|
||||
void PublishCameraFrameStageGraphDepthAliasResource(
|
||||
CameraFrameRenderGraphResources& frameResources,
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const DirectionalShadowExecutionState& shadowState) {
|
||||
switch (GetCameraFrameStagePublishedDepthAliasRole(stageState.stage)) {
|
||||
case CameraFrameStagePublishedDepthAliasRole::MainDirectionalShadow:
|
||||
if (shadowState.HasShadowSampling() &&
|
||||
stageState.outputSurface.depthTexture.IsValid()) {
|
||||
frameResources.mainDirectionalShadow =
|
||||
stageState.outputSurface.depthTexture;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding(
|
||||
@@ -168,12 +185,10 @@ void PublishCameraFrameStageGraphResources(
|
||||
stageState.stage,
|
||||
stageState.outputColor,
|
||||
stageState.outputSurface.depthTexture);
|
||||
|
||||
if (stageState.stage == CameraFrameStage::ShadowCaster &&
|
||||
context.shadowState.HasShadowSampling() &&
|
||||
stageState.outputSurface.depthTexture.IsValid()) {
|
||||
frameResources.mainDirectionalShadow = stageState.outputSurface.depthTexture;
|
||||
}
|
||||
PublishCameraFrameStageGraphDepthAliasResource(
|
||||
frameResources,
|
||||
stageState,
|
||||
context.shadowState);
|
||||
}
|
||||
|
||||
RenderSceneData BuildCameraFrameStandaloneStageSceneData(
|
||||
|
||||
@@ -16,12 +16,7 @@ struct CameraFrameRenderGraphSourceBinding {
|
||||
inline bool UsesCameraFrameStageGraphManagedOutputColor(
|
||||
const CameraFramePlan& plan,
|
||||
CameraFrameStage stage) {
|
||||
switch (stage) {
|
||||
case CameraFrameStage::MainScene:
|
||||
return plan.UsesGraphManagedMainSceneColor();
|
||||
default:
|
||||
return plan.UsesGraphManagedOutputColor(stage);
|
||||
}
|
||||
return plan.UsesGraphManagedOutputColor(stage);
|
||||
}
|
||||
|
||||
inline CameraFrameColorSource ResolveCameraFrameStageGraphManagedColorSource(
|
||||
|
||||
@@ -38,6 +38,12 @@ TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsStageFullscreenAndTransition
|
||||
EXPECT_EQ(
|
||||
GetCameraFrameStageSharedOutputSurfaceRole(CameraFrameStage::PostProcess),
|
||||
CameraFrameStageSharedSurfaceRole::None);
|
||||
EXPECT_EQ(
|
||||
GetCameraFrameStagePublishedDepthAliasRole(CameraFrameStage::ShadowCaster),
|
||||
CameraFrameStagePublishedDepthAliasRole::MainDirectionalShadow);
|
||||
EXPECT_EQ(
|
||||
GetCameraFrameStagePublishedDepthAliasRole(CameraFrameStage::MainScene),
|
||||
CameraFrameStagePublishedDepthAliasRole::None);
|
||||
EXPECT_TRUE(
|
||||
DoesCameraFrameStageFallbackUseColorOnlySurfaceAccess(
|
||||
CameraFrameStage::PostProcess));
|
||||
@@ -102,6 +108,7 @@ TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsGraphManagedOutputColorStage
|
||||
plan.colorChain.usesGraphManagedMainSceneColor = true;
|
||||
plan.colorChain.postProcess.usesGraphManagedOutputColor = true;
|
||||
|
||||
EXPECT_TRUE(plan.UsesGraphManagedOutputColor(CameraFrameStage::MainScene));
|
||||
EXPECT_TRUE(UsesCameraFrameStageGraphManagedOutputColor(plan, CameraFrameStage::MainScene));
|
||||
EXPECT_TRUE(UsesCameraFrameStageGraphManagedOutputColor(plan, CameraFrameStage::PostProcess));
|
||||
EXPECT_FALSE(UsesCameraFrameStageGraphManagedOutputColor(plan, CameraFrameStage::FinalOutput));
|
||||
|
||||
Reference in New Issue
Block a user