Add rendering pass sequence scaffolding

This commit is contained in:
2026-03-30 02:22:17 +08:00
parent b489492af0
commit 2a31628db1
10 changed files with 420 additions and 20 deletions

View File

@@ -7,6 +7,7 @@
#include <XCEngine/Scene/Scene.h>
#include <memory>
#include <string>
#include <vector>
using namespace XCEngine::Components;
@@ -25,6 +26,7 @@ struct MockPipelineState {
RenderClearFlags lastClearFlags = RenderClearFlags::All;
std::vector<CameraComponent*> renderedCameras;
std::vector<RenderClearFlags> renderedClearFlags;
std::vector<std::string> eventLog;
};
class MockPipeline final : public RenderPipeline {
@@ -46,6 +48,7 @@ public:
const RenderContext&,
const RenderSurface& surface,
const RenderSceneData& sceneData) override {
m_state->eventLog.push_back("pipeline");
++m_state->renderCalls;
m_state->lastSurfaceWidth = surface.GetWidth();
m_state->lastSurfaceHeight = surface.GetHeight();
@@ -61,6 +64,32 @@ private:
std::shared_ptr<MockPipelineState> m_state;
};
class TrackingPass final : public RenderPass {
public:
TrackingPass(std::shared_ptr<MockPipelineState> state, const char* label)
: m_state(std::move(state))
, m_label(label) {
}
const char* GetName() const override {
return m_label;
}
bool Initialize(const RenderContext&) override {
m_state->eventLog.push_back(std::string("init:") + m_label);
return true;
}
bool Execute(const RenderPassContext&) override {
m_state->eventLog.push_back(m_label);
return true;
}
private:
std::shared_ptr<MockPipelineState> m_state;
const char* m_label = "";
};
RenderContext CreateValidContext() {
RenderContext context;
context.device = reinterpret_cast<XCEngine::RHI::RHIDevice*>(1);
@@ -105,6 +134,38 @@ TEST(CameraRenderer_Test, UsesOverrideCameraAndSurfaceSizeWhenSubmittingScene) {
EXPECT_EQ(state->lastClearFlags, RenderClearFlags::None);
}
TEST(CameraRenderer_Test, ExecutesInjectedPreAndPostPassSequencesAroundPipelineRender) {
Scene scene("CameraRendererPassScene");
GameObject* cameraObject = scene.CreateGameObject("Camera");
auto* camera = cameraObject->AddComponent<CameraComponent>();
camera->SetPrimary(true);
camera->SetDepth(3.0f);
auto state = std::make_shared<MockPipelineState>();
CameraRenderer renderer(std::make_unique<MockPipeline>(state));
RenderPassSequence prePasses;
prePasses.AddPass(std::make_unique<TrackingPass>(state, "pre"));
RenderPassSequence postPasses;
postPasses.AddPass(std::make_unique<TrackingPass>(state, "post"));
CameraRenderRequest request;
request.scene = &scene;
request.camera = camera;
request.context = CreateValidContext();
request.surface = RenderSurface(320, 180);
request.cameraDepth = camera->GetDepth();
request.preScenePasses = &prePasses;
request.postScenePasses = &postPasses;
ASSERT_TRUE(renderer.Render(request));
EXPECT_EQ(
state->eventLog,
(std::vector<std::string>{ "init:pre", "pre", "pipeline", "init:post", "post" }));
}
TEST(SceneRenderer_Test, BuildsSingleExplicitRequestFromSelectedCamera) {
Scene scene("SceneRendererRequestScene");