refactor: unify builtin forward scene execution
This commit is contained in:
@@ -15,88 +15,6 @@
|
||||
namespace XCEngine {
|
||||
namespace Rendering {
|
||||
namespace Pipelines {
|
||||
namespace Internal {
|
||||
|
||||
class BuiltinForwardOpaquePass final : public RenderPass {
|
||||
public:
|
||||
explicit BuiltinForwardOpaquePass(BuiltinForwardPipeline& pipeline)
|
||||
: m_pipeline(pipeline) {
|
||||
}
|
||||
|
||||
const char* GetName() const override {
|
||||
return "BuiltinForwardOpaquePass";
|
||||
}
|
||||
|
||||
bool Initialize(const RenderContext& context) override {
|
||||
return m_pipeline.EnsureInitialized(context);
|
||||
}
|
||||
|
||||
void Shutdown() override {
|
||||
m_pipeline.DestroyPipelineResources();
|
||||
}
|
||||
|
||||
bool Execute(const RenderPassContext& context) override {
|
||||
return m_pipeline.ExecuteForwardOpaquePass(context);
|
||||
}
|
||||
|
||||
private:
|
||||
BuiltinForwardPipeline& m_pipeline;
|
||||
};
|
||||
|
||||
class BuiltinForwardSkyboxPass final : public RenderPass {
|
||||
public:
|
||||
explicit BuiltinForwardSkyboxPass(BuiltinForwardPipeline& pipeline)
|
||||
: m_pipeline(pipeline) {
|
||||
}
|
||||
|
||||
const char* GetName() const override {
|
||||
return "BuiltinForwardSkyboxPass";
|
||||
}
|
||||
|
||||
bool Initialize(const RenderContext& context) override {
|
||||
return m_pipeline.EnsureInitialized(context);
|
||||
}
|
||||
|
||||
void Shutdown() override {
|
||||
m_pipeline.DestroyPipelineResources();
|
||||
}
|
||||
|
||||
bool Execute(const RenderPassContext& context) override {
|
||||
return m_pipeline.ExecuteForwardSkyboxPass(context);
|
||||
}
|
||||
|
||||
private:
|
||||
BuiltinForwardPipeline& m_pipeline;
|
||||
};
|
||||
|
||||
class BuiltinForwardTransparentPass final : public RenderPass {
|
||||
public:
|
||||
explicit BuiltinForwardTransparentPass(BuiltinForwardPipeline& pipeline)
|
||||
: m_pipeline(pipeline) {
|
||||
}
|
||||
|
||||
const char* GetName() const override {
|
||||
return "BuiltinForwardTransparentPass";
|
||||
}
|
||||
|
||||
bool Initialize(const RenderContext& context) override {
|
||||
return m_pipeline.EnsureInitialized(context);
|
||||
}
|
||||
|
||||
void Shutdown() override {
|
||||
m_pipeline.DestroyPipelineResources();
|
||||
}
|
||||
|
||||
bool Execute(const RenderPassContext& context) override {
|
||||
return m_pipeline.ExecuteForwardTransparentPass(context);
|
||||
}
|
||||
|
||||
private:
|
||||
BuiltinForwardPipeline& m_pipeline;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
namespace {
|
||||
|
||||
bool IsDepthFormat(RHI::Format format) {
|
||||
@@ -104,6 +22,30 @@ bool IsDepthFormat(RHI::Format format) {
|
||||
format == RHI::Format::D32_Float;
|
||||
}
|
||||
|
||||
bool ShouldSampleMainDirectionalShadowMap(const RenderSceneData& sceneData) {
|
||||
return sceneData.lighting.HasMainDirectionalShadow() &&
|
||||
sceneData.lighting.mainDirectionalShadow.shadowMap != nullptr &&
|
||||
IsDepthFormat(sceneData.lighting.mainDirectionalShadow.shadowMap->GetFormat());
|
||||
}
|
||||
|
||||
void TransitionMainDirectionalShadowForSampling(
|
||||
const RenderContext& context,
|
||||
const RenderSceneData& sceneData) {
|
||||
context.commandList->TransitionBarrier(
|
||||
sceneData.lighting.mainDirectionalShadow.shadowMap,
|
||||
RHI::ResourceStates::DepthWrite,
|
||||
RHI::ResourceStates::PixelShaderResource);
|
||||
}
|
||||
|
||||
void RestoreMainDirectionalShadowAfterSampling(
|
||||
const RenderContext& context,
|
||||
const RenderSceneData& sceneData) {
|
||||
context.commandList->TransitionBarrier(
|
||||
sceneData.lighting.mainDirectionalShadow.shadowMap,
|
||||
RHI::ResourceStates::PixelShaderResource,
|
||||
RHI::ResourceStates::DepthWrite);
|
||||
}
|
||||
|
||||
std::vector<RHI::RHIResourceView*> CollectSurfaceColorAttachments(const RenderSurface& surface) {
|
||||
std::vector<RHI::RHIResourceView*> renderTargets;
|
||||
const Core::uint32 colorAttachmentCount =
|
||||
@@ -124,10 +66,7 @@ std::vector<RHI::RHIResourceView*> CollectSurfaceColorAttachments(const RenderSu
|
||||
} // namespace
|
||||
|
||||
BuiltinForwardPipeline::BuiltinForwardPipeline() {
|
||||
m_passSequence.AddPass(std::make_unique<Internal::BuiltinForwardOpaquePass>(*this));
|
||||
m_passSequence.AddPass(std::make_unique<Internal::BuiltinForwardSkyboxPass>(*this));
|
||||
m_passSequence.AddPass(std::make_unique<Passes::BuiltinVolumetricPass>());
|
||||
m_passSequence.AddPass(std::make_unique<Internal::BuiltinForwardTransparentPass>(*this));
|
||||
m_volumetricPass = std::make_unique<Passes::BuiltinVolumetricPass>();
|
||||
}
|
||||
|
||||
BuiltinForwardPipeline::~BuiltinForwardPipeline() {
|
||||
@@ -169,11 +108,16 @@ RHI::InputLayoutDesc BuiltinForwardPipeline::BuildInputLayout() {
|
||||
}
|
||||
|
||||
bool BuiltinForwardPipeline::Initialize(const RenderContext& context) {
|
||||
return m_passSequence.Initialize(context);
|
||||
return EnsureInitialized(context) &&
|
||||
m_volumetricPass != nullptr &&
|
||||
m_volumetricPass->Initialize(context);
|
||||
}
|
||||
|
||||
void BuiltinForwardPipeline::Shutdown() {
|
||||
m_passSequence.Shutdown();
|
||||
if (m_volumetricPass != nullptr) {
|
||||
m_volumetricPass->Shutdown();
|
||||
}
|
||||
DestroyPipelineResources();
|
||||
}
|
||||
|
||||
bool BuiltinForwardPipeline::Render(
|
||||
@@ -193,7 +137,32 @@ bool BuiltinForwardPipeline::Render(
|
||||
RHI::ResourceStates::Common
|
||||
};
|
||||
|
||||
return m_passSequence.Execute(passContext);
|
||||
if (!BeginForwardScenePass(passContext)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const bool sampledDirectionalShadow = ShouldSampleMainDirectionalShadowMap(sceneData);
|
||||
if (sampledDirectionalShadow) {
|
||||
TransitionMainDirectionalShadowForSampling(context, sceneData);
|
||||
}
|
||||
|
||||
bool renderResult = ExecuteForwardOpaquePass(passContext);
|
||||
if (renderResult) {
|
||||
renderResult = ExecuteForwardSkyboxPass(passContext);
|
||||
}
|
||||
if (renderResult && m_volumetricPass != nullptr) {
|
||||
renderResult = m_volumetricPass->Execute(passContext);
|
||||
}
|
||||
if (renderResult) {
|
||||
renderResult = ExecuteForwardTransparentPass(passContext);
|
||||
}
|
||||
|
||||
if (sampledDirectionalShadow) {
|
||||
RestoreMainDirectionalShadowAfterSampling(context, sceneData);
|
||||
}
|
||||
EndForwardScenePass(passContext);
|
||||
|
||||
return renderResult;
|
||||
}
|
||||
|
||||
bool BuiltinForwardPipeline::BeginForwardScenePass(const RenderPassContext& passContext) {
|
||||
@@ -309,18 +278,6 @@ bool BuiltinForwardPipeline::ExecuteForwardOpaquePass(const RenderPassContext& p
|
||||
const RenderSurface& surface = passContext.surface;
|
||||
const RenderSceneData& sceneData = passContext.sceneData;
|
||||
|
||||
if (!BeginForwardScenePass(passContext)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (sceneData.lighting.HasMainDirectionalShadow() &&
|
||||
IsDepthFormat(sceneData.lighting.mainDirectionalShadow.shadowMap->GetFormat())) {
|
||||
context.commandList->TransitionBarrier(
|
||||
sceneData.lighting.mainDirectionalShadow.shadowMap,
|
||||
RHI::ResourceStates::DepthWrite,
|
||||
RHI::ResourceStates::PixelShaderResource);
|
||||
}
|
||||
|
||||
return DrawVisibleItems(context, surface, sceneData, false);
|
||||
}
|
||||
|
||||
@@ -329,19 +286,7 @@ bool BuiltinForwardPipeline::ExecuteForwardTransparentPass(const RenderPassConte
|
||||
const RenderSurface& surface = passContext.surface;
|
||||
const RenderSceneData& sceneData = passContext.sceneData;
|
||||
|
||||
const bool drawResult = DrawVisibleItems(context, surface, sceneData, true);
|
||||
|
||||
if (sceneData.lighting.HasMainDirectionalShadow() &&
|
||||
IsDepthFormat(sceneData.lighting.mainDirectionalShadow.shadowMap->GetFormat())) {
|
||||
context.commandList->TransitionBarrier(
|
||||
sceneData.lighting.mainDirectionalShadow.shadowMap,
|
||||
RHI::ResourceStates::PixelShaderResource,
|
||||
RHI::ResourceStates::DepthWrite);
|
||||
}
|
||||
|
||||
EndForwardScenePass(passContext);
|
||||
|
||||
return drawResult;
|
||||
return DrawVisibleItems(context, surface, sceneData, true);
|
||||
}
|
||||
|
||||
bool BuiltinForwardPipeline::DrawVisibleItems(
|
||||
|
||||
Reference in New Issue
Block a user