121 lines
4.8 KiB
C++
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
|