Graph-ify forward feature injection points

This commit is contained in:
2026-04-14 16:49:06 +08:00
parent a4c48c1b3f
commit 2a9264cfe4
9 changed files with 861 additions and 119 deletions

View File

@@ -335,11 +335,6 @@ private:
const FrameExecutionContext& executionContext,
size_t beginStepIndex,
size_t endStepIndex);
bool ExecuteForwardSceneSegmentPass(
const FrameExecutionContext& executionContext,
size_t beginStepIndex,
size_t endStepIndex,
bool clearAttachments);
bool BeginForwardScenePass(
const RenderPassContext& context,
bool clearAttachments = true);

View File

@@ -0,0 +1,33 @@
#pragma once
#include <XCEngine/Rendering/SceneRenderFeaturePass.h>
#include <memory>
#include <vector>
namespace XCEngine {
namespace Rendering {
class SceneRenderFeatureHost {
public:
void AddFeaturePass(std::unique_ptr<SceneRenderFeaturePass> featurePass);
size_t GetFeaturePassCount() const;
SceneRenderFeaturePass* GetFeaturePass(size_t index) const;
bool Initialize(const RenderContext& context);
void Shutdown();
bool Prepare(const FrameExecutionContext& executionContext) const;
bool Record(
const SceneRenderFeaturePassRenderGraphContext& context,
SceneRenderInjectionPoint injectionPoint,
bool* recordedAnyPass = nullptr) const;
bool Execute(
const FrameExecutionContext& executionContext,
SceneRenderInjectionPoint injectionPoint) const;
private:
std::vector<std::unique_ptr<SceneRenderFeaturePass>> m_featurePasses;
};
} // namespace Rendering
} // namespace XCEngine

View File

@@ -1,16 +1,59 @@
#pragma once
#include <XCEngine/Core/Containers/String.h>
#include <XCEngine/Rendering/Execution/SceneRenderInjectionPoint.h>
#include <XCEngine/Rendering/Graph/RenderGraphTypes.h>
#include <XCEngine/Rendering/RenderPass.h>
#include <XCEngine/Rendering/RenderSurface.h>
#include <functional>
namespace XCEngine {
namespace Rendering {
class RenderGraphBuilder;
using SceneRenderFeaturePassBeginCallback = std::function<bool(const RenderPassContext&, bool clearAttachments)>;
using SceneRenderFeaturePassEndCallback = std::function<void(const RenderPassContext&)>;
struct SceneRenderFeaturePassRenderGraphContext {
RenderGraphBuilder& graphBuilder;
Containers::String passName = {};
const RenderContext& renderContext;
const RenderSceneData& sceneData;
RenderSurface surface = {};
const RenderSurface* sourceSurface = nullptr;
RHI::RHIResourceView* sourceColorView = nullptr;
RHI::ResourceStates sourceColorState = RHI::ResourceStates::Common;
std::vector<RenderGraphTextureHandle> colorTargets = {};
RenderGraphTextureHandle depthTarget = {};
RenderGraphTextureHandle mainDirectionalShadowTexture = {};
bool clearAttachments = false;
bool* executionSucceeded = nullptr;
SceneRenderFeaturePassBeginCallback beginPassCallback = {};
SceneRenderFeaturePassEndCallback endPassCallback = {};
};
class SceneRenderFeaturePass : public RenderPass {
public:
~SceneRenderFeaturePass() override = default;
virtual SceneRenderInjectionPoint GetInjectionPoint() const {
return SceneRenderInjectionPoint::BeforeTransparent;
}
bool SupportsInjectionPoint(SceneRenderInjectionPoint injectionPoint) const {
return GetInjectionPoint() == injectionPoint;
}
virtual bool IsActive(const RenderSceneData& sceneData) const = 0;
virtual bool Prepare(const FrameExecutionContext& executionContext) {
return Prepare(
executionContext.renderContext,
executionContext.sceneData);
}
virtual bool Prepare(
const RenderContext& renderContext,
const RenderSceneData& sceneData) {
@@ -18,6 +61,9 @@ public:
(void)sceneData;
return true;
}
virtual bool RecordRenderGraph(
const SceneRenderFeaturePassRenderGraphContext& context);
};
} // namespace Rendering