Files
XCEngine/engine/include/XCEngine/Rendering/Pipelines/ScriptableRenderPipelineHost.h

121 lines
4.8 KiB
C++

#pragma once
#include <XCEngine/Rendering/RenderPipeline.h>
#include <XCEngine/Rendering/RenderPipelineAsset.h>
#include <array>
#include <memory>
namespace XCEngine {
namespace Rendering {
namespace Pipelines {
class ManagedRenderPipelineAssetRuntime;
class ScriptableRenderPipelineHost final : public RenderPipeline {
public:
ScriptableRenderPipelineHost();
explicit ScriptableRenderPipelineHost(
std::unique_ptr<RenderPipelineBackend> pipelineBackend);
explicit ScriptableRenderPipelineHost(
std::shared_ptr<const RenderPipelineAsset> pipelineBackendAsset);
ScriptableRenderPipelineHost(
std::shared_ptr<const RenderPipelineAsset> pipelineBackendAsset,
std::shared_ptr<const ManagedRenderPipelineAssetRuntime>
managedAssetRuntime);
~ScriptableRenderPipelineHost() override;
using RenderPipeline::Render;
void SetStageRecorder(std::unique_ptr<RenderPipelineStageRecorder> stageRecorder);
void SetPipelineBackend(std::unique_ptr<RenderPipelineBackend> pipelineBackend);
void SetPipelineBackendAsset(
std::shared_ptr<const RenderPipelineAsset> pipelineBackendAsset);
void SetManagedAssetRuntime(
std::shared_ptr<const ManagedRenderPipelineAssetRuntime>
managedAssetRuntime);
RenderPipelineStageRecorder* GetStageRecorder() const {
return m_stageRecorder.get();
}
using RenderPipeline::GetCameraFrameStandalonePass;
RenderPipelineBackend* GetPipelineBackend() const {
return m_pipelineBackend.get();
}
const RenderPipelineAsset* GetPipelineBackendAsset() const {
return m_pipelineBackendAsset.get();
}
bool Initialize(const RenderContext& context) override;
void Shutdown() override;
bool SupportsStageRenderGraph(CameraFrameStage stage) const override;
bool SupportsStageRenderGraph(
const RenderPipelineStageSupportContext& context) const override;
bool AllowsCameraFrameStageFallback(CameraFrameStage stage) const override;
bool AllowsCameraFrameStageFallback(
const RenderPipelineStageSupportContext& context) const override;
bool RecordStageRenderGraph(
const RenderPipelineStageRenderGraphContext& context) override;
bool Render(const FrameExecutionContext& executionContext) override;
bool Render(
const RenderContext& context,
const RenderSurface& surface,
const RenderSceneData& sceneData) override;
void FinishCameraStackRendering(
const CameraStackFramePlan& stackPlan) override;
void ConfigureRenderSceneData(
const CameraFramePlan& plan,
RenderSceneData& sceneData) const override;
bool ConfigureDirectionalShadowExecutionState(
const CameraFramePlan& plan,
const DirectionalShadowSurfaceAllocation& shadowAllocation,
DirectionalShadowExecutionState& shadowState) const override;
RenderPass* GetCameraFrameStandalonePass(
CameraFrameStage stage,
int32_t rendererIndex) const override;
private:
bool EnsureInitialized(const RenderContext& context);
RenderPass* ResolvePipelineBackendStandalonePass(
CameraFrameStage stage,
int32_t rendererIndex) const;
void BindStageRecorderPipelineBackend();
void ShutdownInitializedComponents();
void ResetInitializationState();
void ClearInitializationContextIfNoComponentsAreInitialized();
void ResetStageRecorder(std::unique_ptr<RenderPipelineStageRecorder> stageRecorder);
void ResetPipelineBackend(std::unique_ptr<RenderPipelineBackend> pipelineBackend);
std::unique_ptr<RenderPipelineStageRecorder> m_stageRecorder;
std::shared_ptr<const RenderPipelineAsset> m_pipelineBackendAsset;
std::shared_ptr<const ManagedRenderPipelineAssetRuntime>
m_managedAssetRuntime;
std::unique_ptr<RenderPipelineBackend> m_pipelineBackend;
RHI::RHIDevice* m_initializedDevice = nullptr;
RHI::RHIType m_initializedBackendType = RHI::RHIType::D3D12;
bool m_pipelineBackendInitialized = false;
bool m_stageRecorderInitialized = false;
};
class ScriptableRenderPipelineHostAsset final : public RenderPipelineAsset {
public:
ScriptableRenderPipelineHostAsset();
explicit ScriptableRenderPipelineHostAsset(
std::shared_ptr<const RenderPipelineAsset> pipelineBackendAsset);
ScriptableRenderPipelineHostAsset(
std::shared_ptr<const RenderPipelineAsset> pipelineBackendAsset,
std::shared_ptr<const ManagedRenderPipelineAssetRuntime>
managedAssetRuntime);
std::unique_ptr<RenderPipeline> CreatePipeline() const override;
FinalColorSettings GetDefaultFinalColorSettings() const override;
private:
std::shared_ptr<const RenderPipelineAsset> m_pipelineBackendAsset;
std::shared_ptr<const ManagedRenderPipelineAssetRuntime>
m_managedAssetRuntime;
};
} // namespace Pipelines
} // namespace Rendering
} // namespace XCEngine