refactor: extract scene viewport post-pass planning

This commit is contained in:
2026-03-31 21:54:00 +08:00
parent ad237cb81e
commit f85fa78dd1
6 changed files with 435 additions and 114 deletions

View File

@@ -7,6 +7,33 @@
namespace XCEngine {
namespace Rendering {
namespace {
bool InitializePassSequence(
RenderPassSequence* sequence,
const RenderContext& context,
bool& initialized) {
if (sequence == nullptr) {
initialized = false;
return true;
}
initialized = sequence->Initialize(context);
if (!initialized) {
sequence->Shutdown();
}
return initialized;
}
void ShutdownPassSequence(RenderPassSequence* sequence, bool initialized) {
if (sequence != nullptr && initialized) {
sequence->Shutdown();
}
}
} // namespace
CameraRenderer::CameraRenderer()
: m_pipeline(std::make_unique<Pipelines::BuiltinForwardPipeline>()) {
}
@@ -57,24 +84,42 @@ bool CameraRenderer::Render(
sceneData
};
if (request.preScenePasses != nullptr) {
if (!request.preScenePasses->Initialize(request.context) ||
!request.preScenePasses->Execute(passContext)) {
return false;
}
bool preScenePassesInitialized = false;
if (!InitializePassSequence(
request.preScenePasses,
request.context,
preScenePassesInitialized)) {
return false;
}
if (!m_pipeline->Render(request.context, request.surface, sceneData)) {
if (request.preScenePasses != nullptr &&
!request.preScenePasses->Execute(passContext)) {
ShutdownPassSequence(request.preScenePasses, preScenePassesInitialized);
return false;
}
if (request.postScenePasses != nullptr) {
if (!request.postScenePasses->Initialize(request.context) ||
!request.postScenePasses->Execute(passContext)) {
return false;
}
if (!m_pipeline->Render(request.context, request.surface, sceneData)) {
ShutdownPassSequence(request.preScenePasses, preScenePassesInitialized);
return false;
}
bool postScenePassesInitialized = false;
if (!InitializePassSequence(
request.postScenePasses,
request.context,
postScenePassesInitialized)) {
ShutdownPassSequence(request.preScenePasses, preScenePassesInitialized);
return false;
}
if (request.postScenePasses != nullptr &&
!request.postScenePasses->Execute(passContext)) {
ShutdownPassSequence(request.postScenePasses, postScenePassesInitialized);
ShutdownPassSequence(request.preScenePasses, preScenePassesInitialized);
return false;
}
ShutdownPassSequence(request.postScenePasses, postScenePassesInitialized);
ShutdownPassSequence(request.preScenePasses, preScenePassesInitialized);
return true;
}