refactor(rendering): move stage resource publication into contract

This commit is contained in:
2026-04-15 10:42:10 +08:00
parent e95bdb3149
commit ddfed4c37b
6 changed files with 139 additions and 25 deletions

View File

@@ -3,6 +3,7 @@
#include "Rendering/Execution/Internal/CameraFrameRenderGraphBuilderContext.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h"
#include "Rendering/Execution/DirectionalShadowExecutionState.h"
#include "Rendering/Graph/RenderGraph.h"
#include <XCEngine/Rendering/RenderPassGraphContract.h>
#include <XCEngine/Rendering/Graph/RenderGraphRecordingContext.h>
@@ -35,6 +36,23 @@ CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding(
};
}
void PublishCameraFrameStageGraphResources(
const CameraFrameStageGraphBuildState& stageState,
const CameraFrameRenderGraphStageContext& context) {
CameraFrameRenderGraphResources& frameResources = context.builder.frameData.resources;
WriteCameraFrameRenderGraphStageSurfaceResources(
frameResources,
stageState.stage,
stageState.outputColor,
stageState.outputSurface.depthTexture);
if (stageState.stage == CameraFrameStage::ShadowCaster &&
context.shadowState.HasShadowSampling() &&
stageState.outputSurface.depthTexture.IsValid()) {
frameResources.mainDirectionalShadow = stageState.outputSurface.depthTexture;
}
}
RenderPassContext BuildCameraFrameStageGraphPassContext(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState,

View File

@@ -23,6 +23,10 @@ struct CameraFrameStageFallbackSurfaceResolution {
CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding(
const CameraFrameStageGraphBuildState& stageState);
void PublishCameraFrameStageGraphResources(
const CameraFrameStageGraphBuildState& stageState,
const CameraFrameRenderGraphStageContext& context);
RenderPassContext BuildCameraFrameStageGraphPassContext(
const CameraFrameRenderGraphStageContext& context,
const CameraFrameStageGraphBuildState& stageState,

View File

@@ -1,5 +1,6 @@
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h"
@@ -31,7 +32,7 @@ bool RecordCameraFrameRenderGraphStage(
BuildCameraFrameStageGraphBuildState(
stage,
context);
PublishCameraFrameStageGraphBuildState(stageState, context);
PublishCameraFrameStageGraphResources(stageState, context);
for (CameraFrameStageRecordHandler handler : kCameraFrameStageRecordHandlers) {
bool stageHandled = false;

View File

@@ -1,10 +1,7 @@
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h"
#include <XCEngine/Rendering/Execution/CameraFrameRenderGraphFrameData.h>
#include "Rendering/Execution/Internal/CameraFrameRenderGraphBuilderContext.h"
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePolicy.h"
#include "Rendering/Execution/DirectionalShadowExecutionState.h"
#include "Rendering/Execution/Internal/CameraFrameStageSurfaceResolver.h"
namespace XCEngine {
@@ -59,22 +56,5 @@ CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState(
return stageState;
}
void PublishCameraFrameStageGraphBuildState(
const CameraFrameStageGraphBuildState& stageState,
const CameraFrameRenderGraphStageContext& context) {
CameraFrameRenderGraphResources& frameResources = context.builder.frameData.resources;
if (stageState.stage == CameraFrameStage::ShadowCaster &&
context.shadowState.HasShadowSampling() &&
stageState.outputSurface.depthTexture.IsValid()) {
frameResources.mainDirectionalShadow = stageState.outputSurface.depthTexture;
}
WriteCameraFrameRenderGraphStageSurfaceResources(
frameResources,
stageState.stage,
stageState.outputColor,
stageState.outputSurface.depthTexture);
}
} // namespace Rendering
} // namespace XCEngine

View File

@@ -27,9 +27,5 @@ CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState(
CameraFrameStage stage,
const CameraFrameRenderGraphStageContext& context);
void PublishCameraFrameStageGraphBuildState(
const CameraFrameStageGraphBuildState& stageState,
const CameraFrameRenderGraphStageContext& context);
} // namespace Rendering
} // namespace XCEngine

View File

@@ -209,6 +209,121 @@ TEST(CameraFrameRenderGraphStageContract_Test, BuildsPassContextFromStageState)
XCEngine::RHI::ResourceStates::PixelShaderResource);
}
TEST(CameraFrameRenderGraphStageContract_Test, PublishesStageSurfaceResourcesIntoFrameData) {
RenderGraph graph = {};
RenderGraphBuilder graphBuilder(graph);
RenderGraphBlackboard blackboard = {};
CameraFrameRenderGraphFrameData& frameData =
EmplaceCameraFrameRenderGraphFrameData(blackboard);
RenderGraphImportedTextureRegistry importedTextures = {};
CameraFrameExecutionState executionState = {};
bool stageExecutionSucceeded = true;
CameraFrameRenderGraphBuilderContext builderContext = {
graphBuilder,
blackboard,
frameData,
importedTextures,
executionState,
stageExecutionSucceeded
};
CameraFramePlan plan = {};
DirectionalShadowExecutionState shadowState = {};
RenderSceneData sceneData = {};
const CameraFrameRenderGraphStageContext context = {
plan,
shadowState,
sceneData,
builderContext
};
CameraFrameStageGraphBuildState stageState = {};
stageState.stage = CameraFrameStage::MainScene;
stageState.outputColor = RenderGraphTextureHandle{ 91u };
stageState.outputSurface.depthTexture = RenderGraphTextureHandle{ 92u };
PublishCameraFrameStageGraphResources(stageState, context);
EXPECT_EQ(frameData.resources.mainScene.color.index, 91u);
EXPECT_EQ(frameData.resources.mainScene.depth.index, 92u);
EXPECT_FALSE(frameData.resources.mainDirectionalShadow.IsValid());
}
TEST(CameraFrameRenderGraphStageContract_Test, PublishesShadowCasterDepthAliasOnlyWhenShadowSamplingIsValid) {
RenderGraph graph = {};
RenderGraphBuilder graphBuilder(graph);
RenderGraphBlackboard blackboard = {};
CameraFrameRenderGraphFrameData& frameData =
EmplaceCameraFrameRenderGraphFrameData(blackboard);
RenderGraphImportedTextureRegistry importedTextures = {};
CameraFrameExecutionState executionState = {};
bool stageExecutionSucceeded = true;
CameraFrameRenderGraphBuilderContext builderContext = {
graphBuilder,
blackboard,
frameData,
importedTextures,
executionState,
stageExecutionSucceeded
};
CameraFramePlan plan = {};
DirectionalShadowExecutionState shadowState = {};
shadowState.shadowData.enabled = true;
shadowState.shadowData.shadowMap =
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(101);
RenderSceneData sceneData = {};
const CameraFrameRenderGraphStageContext context = {
plan,
shadowState,
sceneData,
builderContext
};
CameraFrameStageGraphBuildState stageState = {};
stageState.stage = CameraFrameStage::ShadowCaster;
stageState.outputSurface.depthTexture = RenderGraphTextureHandle{ 102u };
PublishCameraFrameStageGraphResources(stageState, context);
EXPECT_EQ(frameData.resources.mainDirectionalShadow.index, 102u);
EXPECT_FALSE(frameData.resources.mainScene.depth.IsValid());
}
TEST(CameraFrameRenderGraphStageContract_Test, DoesNotPublishShadowCasterDepthAliasWithoutValidShadowSampling) {
RenderGraph graph = {};
RenderGraphBuilder graphBuilder(graph);
RenderGraphBlackboard blackboard = {};
CameraFrameRenderGraphFrameData& frameData =
EmplaceCameraFrameRenderGraphFrameData(blackboard);
RenderGraphImportedTextureRegistry importedTextures = {};
CameraFrameExecutionState executionState = {};
bool stageExecutionSucceeded = true;
CameraFrameRenderGraphBuilderContext builderContext = {
graphBuilder,
blackboard,
frameData,
importedTextures,
executionState,
stageExecutionSucceeded
};
CameraFramePlan plan = {};
DirectionalShadowExecutionState shadowState = {};
RenderSceneData sceneData = {};
const CameraFrameRenderGraphStageContext context = {
plan,
shadowState,
sceneData,
builderContext
};
CameraFrameStageGraphBuildState stageState = {};
stageState.stage = CameraFrameStage::ShadowCaster;
stageState.outputSurface.depthTexture = RenderGraphTextureHandle{ 111u };
PublishCameraFrameStageGraphResources(stageState, context);
EXPECT_FALSE(frameData.resources.mainDirectionalShadow.IsValid());
}
TEST(CameraFrameRenderGraphStageContract_Test, BuildsRecordingContextFromStageStateAndOverrides) {
RenderGraph graph = {};
RenderGraphBuilder graphBuilder(graph);