Rendering: formalize main-scene graph contract

This commit is contained in:
2026-04-15 07:56:00 +08:00
parent 8b156dd112
commit 2cda9fd24a
9 changed files with 276 additions and 59 deletions

View File

@@ -2,14 +2,12 @@
#include "Debug/Logger.h"
#include "Rendering/Graph/RenderGraph.h"
#include <XCEngine/Rendering/Graph/RenderGraphRecordingContext.h>
#include <XCEngine/Rendering/RenderPassGraphContract.h>
#include "Rendering/Pipelines/BuiltinForwardPipeline.h"
#include "Rendering/Pipelines/Internal/BuiltinForwardSceneSetup.h"
#include "Rendering/RenderSurface.h"
#include <XCEngine/Rendering/RenderPipelineMainSceneGraphContract.h>
#include <memory>
#include <string>
namespace XCEngine {
namespace Rendering {
@@ -28,15 +26,6 @@ struct ForwardSceneGraphExecutionState {
bool initialized = false;
};
Containers::String BuildForwardScenePhasePassName(
const Containers::String& baseName,
ScenePhase scenePhase) {
std::string name = baseName.CStr();
name += '.';
name += ToString(scenePhase);
return Containers::String(name.c_str());
}
bool ScenePhaseSamplesMainDirectionalShadow(ScenePhase scenePhase) {
return scenePhase == ScenePhase::Opaque ||
scenePhase == ScenePhase::Transparent;
@@ -47,10 +36,7 @@ bool ScenePhaseSamplesMainDirectionalShadow(ScenePhase scenePhase) {
bool BuiltinForwardMainSceneGraphBuilder::Record(
BuiltinForwardPipeline& pipeline,
const RenderPipelineMainSceneRenderGraphContext& context) {
const Containers::String passName = context.passName;
const RenderContext renderContext = context.renderContext;
const std::shared_ptr<const RenderSceneData> sceneData =
std::make_shared<RenderSceneData>(context.sceneData);
const RenderSurface surfaceTemplate =
BuildGraphManagedForwardSceneSurface(context.surfaceTemplate);
const bool hasSourceSurface = context.sourceSurface != nullptr;
@@ -58,8 +44,6 @@ bool BuiltinForwardMainSceneGraphBuilder::Record(
hasSourceSurface ? *context.sourceSurface : RenderSurface();
RHI::RHIResourceView* const sourceColorView = context.sourceColorView;
const RHI::ResourceStates sourceColorState = context.sourceColorState;
const std::vector<RenderGraphTextureHandle> colorTargets = context.colorTargets;
const RenderGraphTextureHandle depthTarget = context.depthTarget;
const CameraFrameRenderGraphResources* const frameResources =
TryGetCameraFrameRenderGraphResources(context.blackboard);
const RenderGraphTextureHandle mainDirectionalShadowTexture =
@@ -67,13 +51,27 @@ bool BuiltinForwardMainSceneGraphBuilder::Record(
? frameResources->mainDirectionalShadow
: RenderGraphTextureHandle{};
bool* const executionSucceeded = context.executionSucceeded;
const RenderPipelineMainSceneRenderGraphContext graphContext = {
context.graphBuilder,
context.passName,
renderContext,
context.sceneData,
surfaceTemplate,
hasSourceSurface ? &sourceSurface : nullptr,
sourceColorView,
sourceColorState,
context.sourceColorTexture,
context.colorTargets,
context.depthTarget,
executionSucceeded,
context.blackboard
};
const std::shared_ptr<ForwardSceneGraphExecutionState> graphExecutionState =
std::make_shared<ForwardSceneGraphExecutionState>();
const SceneRenderFeaturePassBeginCallback beginRecordedPass =
[&pipeline,
graphExecutionState,
renderContext,
sceneData,
hasSourceSurface,
sourceSurface,
sourceColorView,
@@ -97,9 +95,9 @@ bool BuiltinForwardMainSceneGraphBuilder::Record(
}
const FrameExecutionContext executionContext(
renderContext,
passContext.renderContext,
passContext.surface,
*sceneData,
passContext.sceneData,
hasSourceSurface ? &sourceSurface : nullptr,
sourceColorView,
sourceColorState);
@@ -132,35 +130,18 @@ bool BuiltinForwardMainSceneGraphBuilder::Record(
[&pipeline](const RenderPassContext& passContext) {
pipeline.EndForwardScenePass(passContext);
};
const ::XCEngine::Rendering::RenderGraphRecordingContext commonContext = {
context.graphBuilder,
passName,
renderContext,
*sceneData,
surfaceTemplate,
hasSourceSurface ? &sourceSurface : nullptr,
sourceColorView,
sourceColorState,
{},
colorTargets,
depthTarget,
executionSucceeded,
context.blackboard
};
bool clearAttachments = true;
for (const ForwardSceneStep& step : GetBuiltinForwardSceneSteps()) {
if (step.type == ForwardSceneStepType::InjectionPoint) {
const SceneRenderFeaturePassRenderGraphContext featureContext =
::XCEngine::Rendering::BuildSceneRenderFeaturePassRenderGraphContext(
commonContext,
bool recordedAnyPass = false;
if (!::XCEngine::Rendering::RecordRenderPipelineMainSceneFeaturePasses(
graphContext,
pipeline.m_forwardSceneFeatureHost,
step.injectionPoint,
clearAttachments,
beginRecordedPass,
endRecordedPass);
bool recordedAnyPass = false;
if (!pipeline.m_forwardSceneFeatureHost.Record(
featureContext,
step.injectionPoint,
endRecordedPass,
&recordedAnyPass)) {
return false;
}
@@ -171,8 +152,6 @@ bool BuiltinForwardMainSceneGraphBuilder::Record(
continue;
}
const Containers::String phasePassName =
BuildForwardScenePhasePassName(passName, step.scenePhase);
const RenderPassGraphBeginCallback beginPhasePass =
[beginRecordedPass, clearAttachments](const RenderPassContext& passContext) {
return beginRecordedPass(passContext, clearAttachments);
@@ -182,20 +161,9 @@ bool BuiltinForwardMainSceneGraphBuilder::Record(
mainDirectionalShadowTexture.IsValid()
? std::vector<RenderGraphTextureHandle>{ mainDirectionalShadowTexture }
: std::vector<RenderGraphTextureHandle>{};
::XCEngine::Rendering::RenderGraphRecordingContext phaseCommonContext = commonContext;
phaseCommonContext.passName = phasePassName;
const RenderPassRenderGraphContext phaseContext =
::XCEngine::Rendering::BuildRenderPassRenderGraphContext(
phaseCommonContext,
beginPhasePass,
endRecordedPass);
if (!::XCEngine::Rendering::RecordCallbackRasterRenderPass(
phaseContext,
{
false,
true,
depthTarget.IsValid()
},
if (!::XCEngine::Rendering::RecordRenderPipelineMainScenePhasePass(
graphContext,
step.scenePhase,
[&pipeline, scenePhase = step.scenePhase](const RenderPassContext& passContext) {
const FrameExecutionContext executionContext(
passContext.renderContext,
@@ -208,6 +176,8 @@ bool BuiltinForwardMainSceneGraphBuilder::Record(
pipeline.BuildScenePhaseExecutionContext(executionContext, scenePhase);
return pipeline.ExecuteBuiltinScenePhase(scenePhaseExecutionContext);
},
beginPhasePass,
endRecordedPass,
additionalReadTextures)) {
return false;
}

View File

@@ -0,0 +1,95 @@
#include <XCEngine/Rendering/RenderPipelineMainSceneGraphContract.h>
#include <XCEngine/Rendering/Graph/RenderGraphRecordingContext.h>
#include <XCEngine/Rendering/SceneRenderFeatureHost.h>
#include <string>
#include <utility>
namespace XCEngine {
namespace Rendering {
namespace {
RenderGraphRecordingContext BuildCommonContext(
const RenderPipelineMainSceneRenderGraphContext& context,
Containers::String passName) {
return {
context.graphBuilder,
passName,
context.renderContext,
context.sceneData,
context.surfaceTemplate,
context.sourceSurface,
context.sourceColorView,
context.sourceColorState,
context.sourceColorTexture,
context.colorTargets,
context.depthTarget,
context.executionSucceeded,
context.blackboard
};
}
} // namespace
Containers::String BuildRenderPipelineMainScenePhasePassName(
const Containers::String& baseName,
ScenePhase scenePhase) {
std::string name = baseName.CStr();
if (!name.empty()) {
name += '.';
}
name += ToString(scenePhase);
return Containers::String(name.c_str());
}
bool RecordRenderPipelineMainSceneFeaturePasses(
const RenderPipelineMainSceneRenderGraphContext& context,
SceneRenderFeatureHost& featureHost,
SceneRenderInjectionPoint injectionPoint,
bool clearAttachments,
SceneRenderFeaturePassBeginCallback beginPassCallback,
SceneRenderFeaturePassEndCallback endPassCallback,
bool* recordedAnyPass) {
const SceneRenderFeaturePassRenderGraphContext featureContext =
BuildSceneRenderFeaturePassRenderGraphContext(
BuildCommonContext(context, context.passName),
clearAttachments,
beginPassCallback,
endPassCallback);
return featureHost.Record(
featureContext,
injectionPoint,
recordedAnyPass);
}
bool RecordRenderPipelineMainScenePhasePass(
const RenderPipelineMainSceneRenderGraphContext& context,
ScenePhase scenePhase,
RenderPassGraphExecutePassCallback executePassCallback,
RenderPassGraphBeginCallback beginPassCallback,
RenderPassGraphEndCallback endPassCallback,
std::vector<RenderGraphTextureHandle> additionalReadTextures) {
const RenderPassRenderGraphContext passContext =
BuildRenderPassRenderGraphContext(
BuildCommonContext(
context,
BuildRenderPipelineMainScenePhasePassName(
context.passName,
scenePhase)),
beginPassCallback,
endPassCallback);
return RecordCallbackRasterRenderPass(
passContext,
{
false,
true,
context.depthTarget.IsValid()
},
std::move(executePassCallback),
std::move(additionalReadTextures));
}
} // namespace Rendering
} // namespace XCEngine