refactor(rendering): formalize compatible raster pass recording helpers

This commit is contained in:
2026-04-15 13:12:07 +08:00
parent 3f0f279000
commit b97f9a1555
3 changed files with 123 additions and 23 deletions

View File

@@ -59,6 +59,15 @@ bool RecordRasterRenderPass(
const RenderPassRenderGraphContext& context,
const RenderPassGraphIO& io);
inline bool RecordCompatibleRasterRenderPass(
RenderPass& pass,
const RenderPassRenderGraphContext& context,
const RenderPassGraphIO& io) {
return pass.SupportsRenderGraph()
? pass.RecordRenderGraph(context)
: RecordRasterRenderPass(pass, context, io);
}
inline bool RecordSourceColorFullscreenRasterPass(
RenderPass& pass,
const RenderPassRenderGraphContext& context) {
@@ -86,6 +95,33 @@ inline bool RecordDeclaredRasterPass(
BuildDeclaredRasterPassGraphIO(context));
}
inline bool RecordCompatibleSourceColorFullscreenRasterPass(
RenderPass& pass,
const RenderPassRenderGraphContext& context) {
return RecordCompatibleRasterRenderPass(
pass,
context,
BuildSourceColorFullscreenRasterPassGraphIO());
}
inline bool RecordCompatibleColorDepthRasterPass(
RenderPass& pass,
const RenderPassRenderGraphContext& context) {
return RecordCompatibleRasterRenderPass(
pass,
context,
BuildColorDepthRasterPassGraphIO());
}
inline bool RecordCompatibleDeclaredRasterPass(
RenderPass& pass,
const RenderPassRenderGraphContext& context) {
return RecordCompatibleRasterRenderPass(
pass,
context,
BuildDeclaredRasterPassGraphIO(context));
}
inline bool RecordSourceColorFullscreenCallbackRasterPass(
const RenderPassRenderGraphContext& context,
RenderPassGraphExecutePassCallback executePassCallback,

View File

@@ -12,15 +12,6 @@ namespace Rendering {
namespace {
bool RecordCameraFrameCompatibleGraphPass(
RenderPass& pass,
const RenderPassRenderGraphContext& context,
const RenderPassGraphIO& io) {
return pass.SupportsRenderGraph()
? pass.RecordRenderGraph(context)
: RecordRasterRenderPass(pass, context, io);
}
bool ExecuteCameraFrameScenePassRequestStage(
RenderPass* pass,
const ScenePassRenderRequest& request,
@@ -289,7 +280,7 @@ bool RecordCameraFrameRegularSequenceStageRenderGraphPass(
const RenderGraphImportedSurface& outputSurface,
const RenderPassGraphBeginCallback& beginPassCallback,
RenderPass& pass) {
return RecordCameraFrameCompatibleGraphPass(
return RecordCompatibleDeclaredRasterPass(
pass,
BuildRenderPassRenderGraphContext(
BuildCameraFrameStageGraphRecordingContext(
@@ -300,12 +291,7 @@ bool RecordCameraFrameRegularSequenceStageRenderGraphPass(
BuildCameraFrameStageGraphSourceBinding(stageState),
outputSurface.colorTextures,
outputSurface.depthTexture),
beginPassCallback),
{
false,
GetPrimaryColorTexture(outputSurface).IsValid(),
outputSurface.depthTexture.IsValid()
});
beginPassCallback));
}
CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding(
@@ -447,7 +433,7 @@ bool RecordCameraFrameFullscreenSequenceStageGraphPass(
currentSourceColor
};
const bool recordSucceeded =
RecordCameraFrameCompatibleGraphPass(
RecordCompatibleSourceColorFullscreenRasterPass(
pass,
BuildRenderPassRenderGraphContext(
BuildCameraFrameStageGraphRecordingContext(
@@ -458,12 +444,7 @@ bool RecordCameraFrameFullscreenSequenceStageGraphPass(
passSourceBinding,
std::vector<RenderGraphTextureHandle>{ passOutputColor },
{}),
beginPassCallback),
{
true,
true,
false
});
beginPassCallback));
if (recordSucceeded) {
currentSourceColor = passOutputColor;
}

View File

@@ -49,6 +49,32 @@ RenderPassContext BuildPassContext(
};
}
class CompatibleRecordingRenderPass final : public RenderPass {
public:
const char* GetName() const override {
return "CompatibleRecordingRenderPass";
}
bool SupportsRenderGraph() const override {
return supportsRenderGraph;
}
bool RecordRenderGraph(const RenderPassRenderGraphContext& context) override {
++recordRenderGraphCalls;
lastPassName = context.passName;
return recordRenderGraphResult;
}
bool Execute(const RenderPassContext&) override {
return true;
}
bool supportsRenderGraph = false;
bool recordRenderGraphResult = true;
int recordRenderGraphCalls = 0;
XCEngine::Containers::String lastPassName = {};
};
} // namespace
TEST(RenderPassGraphContract_Test, BuildsSourceColorFullscreenRasterPassGraphIO) {
@@ -98,6 +124,63 @@ TEST(RenderPassGraphContract_Test, BuildsDeclaredRasterPassGraphIOFromContextRes
EXPECT_TRUE(io.writeDepth);
}
TEST(RenderPassGraphContract_Test, RecordCompatibleDeclaredRasterPassUsesRenderGraphPathWhenSupported) {
RenderGraph graph = {};
RenderGraphBuilder builder(graph);
RenderGraphBlackboard blackboard = {};
RenderContext renderContext = {};
RenderSceneData sceneData = {};
RenderSurface surface(1280u, 720u);
RenderSurface sourceSurface(640u, 360u);
bool executionSucceeded = true;
const RenderPassRenderGraphContext passContext =
BuildRenderPassRenderGraphContext(
BuildCommonContext(
builder,
blackboard,
renderContext,
sceneData,
surface,
sourceSurface,
executionSucceeded));
CompatibleRecordingRenderPass pass = {};
pass.supportsRenderGraph = true;
EXPECT_TRUE(RecordCompatibleDeclaredRasterPass(pass, passContext));
EXPECT_EQ(pass.recordRenderGraphCalls, 1);
EXPECT_EQ(pass.lastPassName, XCEngine::Containers::String("Recording.Pass"));
EXPECT_EQ(graph.GetPassCount(), 0u);
}
TEST(RenderPassGraphContract_Test, RecordCompatibleDeclaredRasterPassFallsBackToNativeRasterRecording) {
RenderGraph graph = {};
RenderGraphBuilder builder(graph);
RenderGraphBlackboard blackboard = {};
RenderContext renderContext = {};
RenderSceneData sceneData = {};
RenderSurface surface(1280u, 720u);
RenderSurface sourceSurface(640u, 360u);
bool executionSucceeded = true;
const RenderPassRenderGraphContext passContext =
BuildRenderPassRenderGraphContext(
BuildCommonContext(
builder,
blackboard,
renderContext,
sceneData,
surface,
sourceSurface,
executionSucceeded));
CompatibleRecordingRenderPass pass = {};
pass.supportsRenderGraph = false;
EXPECT_TRUE(RecordCompatibleDeclaredRasterPass(pass, passContext));
EXPECT_EQ(pass.recordRenderGraphCalls, 0);
EXPECT_EQ(graph.GetPassCount(), 1u);
}
TEST(RenderGraphRecordingContext_Test, BuildsRenderPassContextFromSharedRecordingData) {
RenderGraph graph = {};
RenderGraphBuilder builder(graph);