refactor(rendering): move fullscreen stage source binding into contract

This commit is contained in:
2026-04-15 08:38:58 +08:00
parent f049d9d29e
commit 9f3ea11dbc
5 changed files with 136 additions and 130 deletions

View File

@@ -19,6 +19,41 @@ CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding(
};
}
CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding(
const CameraFramePlan& plan,
CameraFrameStage stage,
const RenderSurface& stageSurfaceTemplate,
const RenderSurface* explicitSourceSurfaceTemplate,
RHI::RHIResourceView* explicitSourceColorView,
const RHI::ResourceStates explicitSourceColorState,
const 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;
}
RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState,

View File

@@ -23,6 +23,16 @@ struct CameraFrameStageFallbackSurfaceResolution {
CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding(
const CameraFrameStageGraphBuildState& stageState);
CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding(
const CameraFramePlan& plan,
CameraFrameStage stage,
const RenderSurface& stageSurfaceTemplate,
const RenderSurface* explicitSourceSurfaceTemplate,
RHI::RHIResourceView* explicitSourceColorView,
RHI::ResourceStates explicitSourceColorState,
RenderGraphTextureHandle explicitSourceColor,
const RenderGraphBlackboard* blackboard);
RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState,

View File

@@ -52,40 +52,5 @@ inline CameraFrameColorSource ResolveCameraFrameStageGraphManagedColorSource(
return plan.ResolveStageColorSource(stage);
}
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

View File

@@ -34,6 +34,15 @@ RenderGraphTextureHandle ImportTestTexture(
{});
}
RenderSurface CreateColorSurface(
uint32_t width,
uint32_t height,
XCEngine::RHI::RHIResourceView* colorAttachment) {
RenderSurface surface(width, height);
surface.SetColorAttachment(colorAttachment);
return surface;
}
} // namespace
TEST(CameraFrameRenderGraphStageContract_Test, BuildsSourceBindingFromStageState) {
@@ -121,6 +130,88 @@ TEST(CameraFrameRenderGraphStageContract_Test, BuildsRecordingContextFromStageSt
EXPECT_EQ(recordingContext.blackboard, &blackboard);
}
TEST(CameraFrameRenderGraphStageContract_Test, KeepsExplicitFullscreenSourceBindingUntouched) {
CameraFramePlan plan = {};
RenderSurface stageSurface(320, 180);
RenderSurface explicitSourceSurface =
CreateColorSurface(
320,
180,
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(11));
XCEngine::RHI::RHIResourceView* const explicitSourceColorView =
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(12);
const CameraFrameRenderGraphSourceBinding binding =
ResolveCameraFrameFullscreenStageGraphSourceBinding(
plan,
CameraFrameStage::PostProcess,
stageSurface,
&explicitSourceSurface,
explicitSourceColorView,
XCEngine::RHI::ResourceStates::CopySrc,
RenderGraphTextureHandle{ 21u },
nullptr);
EXPECT_EQ(binding.sourceSurfaceTemplate, &explicitSourceSurface);
EXPECT_EQ(binding.sourceColorView, explicitSourceColorView);
EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::CopySrc);
EXPECT_EQ(binding.sourceColor.index, 21u);
}
TEST(CameraFrameRenderGraphStageContract_Test, ResolvesGraphManagedPostProcessSourceFromBlackboard) {
CameraFramePlan plan = {};
plan.colorChain.postProcess.source = CameraFrameColorSource::MainSceneColor;
RenderGraphBlackboard blackboard = {};
CameraFrameRenderGraphResources& frameResources =
EmplaceCameraFrameRenderGraphFrameData(blackboard).resources;
frameResources.mainScene.color = RenderGraphTextureHandle{ 31u };
RenderSurface stageSurface(640, 360);
const CameraFrameRenderGraphSourceBinding binding =
ResolveCameraFrameFullscreenStageGraphSourceBinding(
plan,
CameraFrameStage::PostProcess,
stageSurface,
nullptr,
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(41),
XCEngine::RHI::ResourceStates::Common,
{},
&blackboard);
EXPECT_EQ(binding.sourceSurfaceTemplate, &stageSurface);
EXPECT_EQ(binding.sourceColorView, nullptr);
EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::PixelShaderResource);
EXPECT_EQ(binding.sourceColor.index, 31u);
}
TEST(CameraFrameRenderGraphStageContract_Test, ResolvesGraphManagedFinalOutputSourceFromBlackboard) {
CameraFramePlan plan = {};
plan.colorChain.finalOutput.source = CameraFrameColorSource::PostProcessColor;
RenderGraphBlackboard blackboard = {};
CameraFrameRenderGraphResources& frameResources =
EmplaceCameraFrameRenderGraphFrameData(blackboard).resources;
frameResources.postProcess.color = RenderGraphTextureHandle{ 51u };
RenderSurface stageSurface(800, 600);
const CameraFrameRenderGraphSourceBinding binding =
ResolveCameraFrameFullscreenStageGraphSourceBinding(
plan,
CameraFrameStage::FinalOutput,
stageSurface,
nullptr,
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(61),
XCEngine::RHI::ResourceStates::Common,
{},
&blackboard);
EXPECT_EQ(binding.sourceSurfaceTemplate, &stageSurface);
EXPECT_EQ(binding.sourceColorView, nullptr);
EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::PixelShaderResource);
EXPECT_EQ(binding.sourceColor.index, 51u);
}
TEST(CameraFrameRenderGraphStageContract_Test, ResolvesFullscreenFallbackSurfaceOverrides) {
CameraFrameStageGraphBuildState stageState = {};
stageState.stage = CameraFrameStage::PostProcess;

View File

@@ -4,19 +4,6 @@
using namespace XCEngine::Rendering;
namespace {
RenderSurface CreateColorSurface(
uint32_t width,
uint32_t height,
XCEngine::RHI::RHIResourceView* colorAttachment) {
RenderSurface surface(width, height);
surface.SetColorAttachment(colorAttachment);
return surface;
}
} // namespace
TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsStageFullscreenAndTransitionPolicies) {
EXPECT_TRUE(IsCameraFrameFullscreenSequenceStage(CameraFrameStage::PostProcess));
EXPECT_TRUE(IsCameraFrameFullscreenSequenceStage(CameraFrameStage::FinalOutput));
@@ -40,85 +27,3 @@ TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsGraphManagedOutputColorStage
EXPECT_TRUE(UsesCameraFrameStageGraphManagedOutputColor(plan, CameraFrameStage::PostProcess));
EXPECT_FALSE(UsesCameraFrameStageGraphManagedOutputColor(plan, CameraFrameStage::FinalOutput));
}
TEST(CameraFrameRenderGraphStagePolicy_Test, KeepsExplicitFullscreenSourceBindingUntouched) {
CameraFramePlan plan = {};
RenderSurface stageSurface(320, 180);
RenderSurface explicitSourceSurface =
CreateColorSurface(
320,
180,
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(11));
XCEngine::RHI::RHIResourceView* const explicitSourceColorView =
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(12);
const CameraFrameRenderGraphSourceBinding binding =
ResolveCameraFrameFullscreenStageGraphSourceBinding(
plan,
CameraFrameStage::PostProcess,
stageSurface,
&explicitSourceSurface,
explicitSourceColorView,
XCEngine::RHI::ResourceStates::CopySrc,
RenderGraphTextureHandle{ 21u },
nullptr);
EXPECT_EQ(binding.sourceSurfaceTemplate, &explicitSourceSurface);
EXPECT_EQ(binding.sourceColorView, explicitSourceColorView);
EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::CopySrc);
EXPECT_EQ(binding.sourceColor.index, 21u);
}
TEST(CameraFrameRenderGraphStagePolicy_Test, ResolvesGraphManagedPostProcessSourceFromBlackboard) {
CameraFramePlan plan = {};
plan.colorChain.postProcess.source = CameraFrameColorSource::MainSceneColor;
RenderGraphBlackboard blackboard = {};
CameraFrameRenderGraphResources& frameResources =
EmplaceCameraFrameRenderGraphFrameData(blackboard).resources;
frameResources.mainScene.color = RenderGraphTextureHandle{ 31u };
RenderSurface stageSurface(640, 360);
const CameraFrameRenderGraphSourceBinding binding =
ResolveCameraFrameFullscreenStageGraphSourceBinding(
plan,
CameraFrameStage::PostProcess,
stageSurface,
nullptr,
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(41),
XCEngine::RHI::ResourceStates::Common,
{},
&blackboard);
EXPECT_EQ(binding.sourceSurfaceTemplate, &stageSurface);
EXPECT_EQ(binding.sourceColorView, nullptr);
EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::PixelShaderResource);
EXPECT_EQ(binding.sourceColor.index, 31u);
}
TEST(CameraFrameRenderGraphStagePolicy_Test, ResolvesGraphManagedFinalOutputSourceFromBlackboard) {
CameraFramePlan plan = {};
plan.colorChain.finalOutput.source = CameraFrameColorSource::PostProcessColor;
RenderGraphBlackboard blackboard = {};
CameraFrameRenderGraphResources& frameResources =
EmplaceCameraFrameRenderGraphFrameData(blackboard).resources;
frameResources.postProcess.color = RenderGraphTextureHandle{ 51u };
RenderSurface stageSurface(800, 600);
const CameraFrameRenderGraphSourceBinding binding =
ResolveCameraFrameFullscreenStageGraphSourceBinding(
plan,
CameraFrameStage::FinalOutput,
stageSurface,
nullptr,
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(61),
XCEngine::RHI::ResourceStates::Common,
{},
&blackboard);
EXPECT_EQ(binding.sourceSurfaceTemplate, &stageSurface);
EXPECT_EQ(binding.sourceColorView, nullptr);
EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::PixelShaderResource);
EXPECT_EQ(binding.sourceColor.index, 51u);
}