refactor(rendering): move sequence graph pass authoring into contract
This commit is contained in:
@@ -2,12 +2,27 @@
|
||||
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphBuilderContext.h"
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.h"
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h"
|
||||
#include "Rendering/Graph/RenderGraph.h"
|
||||
#include <XCEngine/Rendering/RenderPassGraphContract.h>
|
||||
#include <XCEngine/Rendering/Graph/RenderGraphRecordingContext.h>
|
||||
|
||||
namespace XCEngine {
|
||||
namespace Rendering {
|
||||
|
||||
namespace {
|
||||
|
||||
bool RecordCameraFrameCompatibleGraphPass(
|
||||
RenderPass& pass,
|
||||
const RenderPassRenderGraphContext& context,
|
||||
const RenderPassGraphIO& io) {
|
||||
return pass.SupportsRenderGraph()
|
||||
? pass.RecordRenderGraph(context)
|
||||
: RecordRasterRenderPass(pass, context, io);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding(
|
||||
const CameraFrameStageGraphBuildState& stageState) {
|
||||
return {
|
||||
@@ -82,6 +97,32 @@ bool RecordCameraFrameStandaloneStageRenderGraphPass(
|
||||
stageExecutionSucceeded));
|
||||
}
|
||||
|
||||
bool RecordCameraFrameRegularSequenceStageRenderGraphPass(
|
||||
const CameraFrameRenderGraphStageContext& context,
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const Containers::String& passName,
|
||||
const RenderGraphImportedSurface& outputSurface,
|
||||
const RenderPassGraphBeginCallback& beginPassCallback,
|
||||
RenderPass& pass) {
|
||||
return RecordCameraFrameCompatibleGraphPass(
|
||||
pass,
|
||||
BuildRenderPassRenderGraphContext(
|
||||
BuildCameraFrameStageGraphRecordingContext(
|
||||
context,
|
||||
stageState,
|
||||
passName,
|
||||
context.sceneData,
|
||||
BuildCameraFrameStageGraphSourceBinding(stageState),
|
||||
outputSurface.colorTextures,
|
||||
outputSurface.depthTexture),
|
||||
beginPassCallback),
|
||||
{
|
||||
false,
|
||||
GetPrimaryColorTexture(outputSurface).IsValid(),
|
||||
outputSurface.depthTexture.IsValid()
|
||||
});
|
||||
}
|
||||
|
||||
CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding(
|
||||
const CameraFramePlan& plan,
|
||||
CameraFrameStage stage,
|
||||
@@ -159,6 +200,61 @@ RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext(
|
||||
depthTarget);
|
||||
}
|
||||
|
||||
bool RecordCameraFrameFullscreenSequenceStageGraphPass(
|
||||
const CameraFrameRenderGraphStageContext& context,
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const Containers::String& passName,
|
||||
const CameraFrameRenderGraphSourceBinding& binding,
|
||||
RenderGraphTextureHandle finalOutputColor,
|
||||
size_t passIndex,
|
||||
size_t passCount,
|
||||
RenderGraphTextureHandle& currentSourceColor,
|
||||
const RenderPassGraphBeginCallback& beginPassCallback,
|
||||
RenderPass& pass) {
|
||||
const bool isLastPass = (passIndex + 1u) == passCount;
|
||||
const RenderGraphTextureHandle passOutputColor =
|
||||
isLastPass
|
||||
? finalOutputColor
|
||||
: context.builder.graphBuilder.CreateTransientTexture(
|
||||
passName + ".Color",
|
||||
BuildFullscreenTransientTextureDesc(stageState.surfaceTemplate));
|
||||
const CameraFrameRenderGraphSourceBinding passSourceBinding = {
|
||||
passIndex == 0u
|
||||
? binding.sourceSurfaceTemplate
|
||||
: &stageState.surfaceTemplate,
|
||||
passIndex == 0u
|
||||
? binding.sourceColorView
|
||||
: nullptr,
|
||||
passIndex == 0u
|
||||
? binding.sourceColorState
|
||||
: RHI::ResourceStates::PixelShaderResource,
|
||||
currentSourceColor
|
||||
};
|
||||
const bool recordSucceeded =
|
||||
RecordCameraFrameCompatibleGraphPass(
|
||||
pass,
|
||||
BuildRenderPassRenderGraphContext(
|
||||
BuildCameraFrameStageGraphRecordingContext(
|
||||
context,
|
||||
stageState,
|
||||
passName,
|
||||
context.sceneData,
|
||||
passSourceBinding,
|
||||
std::vector<RenderGraphTextureHandle>{ passOutputColor },
|
||||
{}),
|
||||
beginPassCallback),
|
||||
{
|
||||
true,
|
||||
true,
|
||||
false
|
||||
});
|
||||
if (recordSucceeded) {
|
||||
currentSourceColor = passOutputColor;
|
||||
}
|
||||
|
||||
return recordSucceeded;
|
||||
}
|
||||
|
||||
CameraFrameStageFallbackSurfaceResolution ResolveCameraFrameStageFallbackSurfaceResolution(
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
bool graphOwnsSourceTransitions,
|
||||
|
||||
@@ -42,6 +42,14 @@ bool RecordCameraFrameStandaloneStageRenderGraphPass(
|
||||
RenderPass& pass,
|
||||
bool& stageExecutionSucceeded);
|
||||
|
||||
bool RecordCameraFrameRegularSequenceStageRenderGraphPass(
|
||||
const CameraFrameRenderGraphStageContext& context,
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const Containers::String& passName,
|
||||
const RenderGraphImportedSurface& outputSurface,
|
||||
const RenderPassGraphBeginCallback& beginPassCallback,
|
||||
RenderPass& pass);
|
||||
|
||||
CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding(
|
||||
const CameraFramePlan& plan,
|
||||
CameraFrameStage stage,
|
||||
@@ -69,6 +77,18 @@ RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext(
|
||||
std::vector<RenderGraphTextureHandle> colorTargets,
|
||||
RenderGraphTextureHandle depthTarget);
|
||||
|
||||
bool RecordCameraFrameFullscreenSequenceStageGraphPass(
|
||||
const CameraFrameRenderGraphStageContext& context,
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const Containers::String& passName,
|
||||
const CameraFrameRenderGraphSourceBinding& binding,
|
||||
RenderGraphTextureHandle finalOutputColor,
|
||||
size_t passIndex,
|
||||
size_t passCount,
|
||||
RenderGraphTextureHandle& currentSourceColor,
|
||||
const RenderPassGraphBeginCallback& beginPassCallback,
|
||||
RenderPass& pass);
|
||||
|
||||
CameraFrameStageFallbackSurfaceResolution ResolveCameraFrameStageFallbackSurfaceResolution(
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
bool graphOwnsSourceTransitions,
|
||||
|
||||
@@ -7,7 +7,6 @@
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h"
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h"
|
||||
#include "Rendering/Graph/RenderGraph.h"
|
||||
#include <XCEngine/Rendering/RenderPassGraphContract.h>
|
||||
|
||||
namespace XCEngine {
|
||||
namespace Rendering {
|
||||
@@ -45,15 +44,6 @@ std::unique_ptr<ScopedInitializedPassSequence>* ResolveStageSequenceState(
|
||||
}
|
||||
}
|
||||
|
||||
bool RecordSequencePass(
|
||||
RenderPass& pass,
|
||||
const RenderPassRenderGraphContext& context,
|
||||
const RenderPassGraphIO& io) {
|
||||
return pass.SupportsRenderGraph()
|
||||
? pass.RecordRenderGraph(context)
|
||||
: RecordRasterRenderPass(pass, context, io);
|
||||
}
|
||||
|
||||
RenderPassGraphBeginCallback BuildSequenceBeginCallback(
|
||||
CameraFrameStage stage,
|
||||
RenderPassSequence* stageSequence,
|
||||
@@ -129,135 +119,6 @@ bool RecordStageSequencePasses(
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RecordRegularPassSequenceStage(
|
||||
CameraFrameStage stage,
|
||||
const Containers::String& stageName,
|
||||
const CameraFrameRenderGraphStageContext& stageContext,
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const RenderPassContext& stagePassContext,
|
||||
const RenderGraphImportedSurface& outputSurface,
|
||||
const RenderSceneData& sceneData,
|
||||
RenderPassSequence* stageSequence,
|
||||
CameraFrameExecutionState& executionState,
|
||||
bool& stageExecutionSucceeded) {
|
||||
const bool writesColor = GetPrimaryColorTexture(outputSurface).IsValid();
|
||||
const bool writesDepth = outputSurface.depthTexture.IsValid();
|
||||
|
||||
return RecordStageSequencePasses(
|
||||
stage,
|
||||
stageName,
|
||||
stageSequence,
|
||||
executionState,
|
||||
stagePassContext.renderContext,
|
||||
stageExecutionSucceeded,
|
||||
[&stageContext, &stageState, &sceneData, &outputSurface, writesColor, writesDepth](
|
||||
RenderPass& pass,
|
||||
size_t,
|
||||
const Containers::String& passName,
|
||||
const RenderPassGraphBeginCallback& beginSequencePass) {
|
||||
const RenderPassRenderGraphContext passContext =
|
||||
BuildRenderPassRenderGraphContext(
|
||||
BuildCameraFrameStageGraphRecordingContext(
|
||||
stageContext,
|
||||
stageState,
|
||||
passName,
|
||||
sceneData,
|
||||
BuildCameraFrameStageGraphSourceBinding(stageState),
|
||||
outputSurface.colorTextures,
|
||||
outputSurface.depthTexture),
|
||||
beginSequencePass);
|
||||
return RecordSequencePass(
|
||||
pass,
|
||||
passContext,
|
||||
{
|
||||
false,
|
||||
writesColor,
|
||||
writesDepth
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
bool RecordFullscreenPassSequenceStage(
|
||||
CameraFrameStage stage,
|
||||
const Containers::String& stageName,
|
||||
const CameraFrameRenderGraphStageContext& stageContext,
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const RenderPassContext& stagePassContext,
|
||||
const CameraFrameRenderGraphSourceBinding& binding,
|
||||
RenderGraphTextureHandle finalOutputColor,
|
||||
const RenderSceneData& sceneData,
|
||||
RenderPassSequence* stageSequence,
|
||||
CameraFrameExecutionState& executionState,
|
||||
RenderGraphBuilder& graphBuilder,
|
||||
bool& stageExecutionSucceeded) {
|
||||
RenderGraphTextureHandle currentSourceColor = binding.sourceColor;
|
||||
const RenderGraphTextureDesc transientDesc =
|
||||
BuildFullscreenTransientTextureDesc(stagePassContext.surface);
|
||||
|
||||
return RecordStageSequencePasses(
|
||||
stage,
|
||||
stageName,
|
||||
stageSequence,
|
||||
executionState,
|
||||
stagePassContext.renderContext,
|
||||
stageExecutionSucceeded,
|
||||
[&stageContext, &stageState, &stagePassContext, &sceneData, &graphBuilder, &transientDesc, &binding, finalOutputColor, ¤tSourceColor, stageSequence](
|
||||
RenderPass& pass,
|
||||
size_t passIndex,
|
||||
const Containers::String& passName,
|
||||
const RenderPassGraphBeginCallback& beginSequencePass) {
|
||||
const bool isLastPass = (passIndex + 1u) == stageSequence->GetPassCount();
|
||||
const RenderGraphTextureHandle passOutputColor =
|
||||
isLastPass
|
||||
? finalOutputColor
|
||||
: graphBuilder.CreateTransientTexture(
|
||||
passName + ".Color",
|
||||
transientDesc);
|
||||
const RenderSurface* const sourceSurfaceTemplate =
|
||||
passIndex == 0u
|
||||
? binding.sourceSurfaceTemplate
|
||||
: &stagePassContext.surface;
|
||||
RHI::RHIResourceView* const sourceColorView =
|
||||
passIndex == 0u
|
||||
? binding.sourceColorView
|
||||
: nullptr;
|
||||
const RHI::ResourceStates sourceColorState =
|
||||
passIndex == 0u
|
||||
? binding.sourceColorState
|
||||
: RHI::ResourceStates::PixelShaderResource;
|
||||
const RenderPassRenderGraphContext passContext =
|
||||
BuildRenderPassRenderGraphContext(
|
||||
BuildCameraFrameStageGraphRecordingContext(
|
||||
stageContext,
|
||||
stageState,
|
||||
passName,
|
||||
sceneData,
|
||||
{
|
||||
sourceSurfaceTemplate,
|
||||
sourceColorView,
|
||||
sourceColorState,
|
||||
currentSourceColor
|
||||
},
|
||||
std::vector<RenderGraphTextureHandle>{ passOutputColor },
|
||||
{}),
|
||||
beginSequencePass);
|
||||
const bool recordSucceeded =
|
||||
RecordSequencePass(
|
||||
pass,
|
||||
passContext,
|
||||
{
|
||||
true,
|
||||
true,
|
||||
false
|
||||
});
|
||||
if (recordSucceeded) {
|
||||
currentSourceColor = passOutputColor;
|
||||
}
|
||||
|
||||
return recordSucceeded;
|
||||
});
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
bool TryRecordCameraFrameStageSequence(
|
||||
@@ -271,45 +132,68 @@ bool TryRecordCameraFrameStageSequence(
|
||||
}
|
||||
|
||||
handled = true;
|
||||
const RenderPassContext stagePassContext =
|
||||
BuildCameraFrameStageGraphPassContext(
|
||||
context,
|
||||
stageState,
|
||||
context.sceneData);
|
||||
const CameraFrameRenderGraphSourceBinding sourceBinding =
|
||||
BuildCameraFrameStageGraphSourceBinding(stageState);
|
||||
const bool recordResult =
|
||||
IsCameraFrameFullscreenSequenceStage(stageState.stage)
|
||||
? RecordFullscreenPassSequenceStage(
|
||||
stageState.stage,
|
||||
stageState.stageName,
|
||||
context,
|
||||
stageState,
|
||||
stagePassContext,
|
||||
ResolveCameraFrameFullscreenStageGraphSourceBinding(
|
||||
context.plan,
|
||||
? [&]() {
|
||||
RenderGraphTextureHandle currentSourceColor = {};
|
||||
const CameraFrameRenderGraphSourceBinding fullscreenBinding =
|
||||
ResolveCameraFrameFullscreenStageGraphSourceBinding(
|
||||
context.plan,
|
||||
stageState.stage,
|
||||
stageState.surfaceTemplate,
|
||||
sourceBinding.sourceSurfaceTemplate,
|
||||
sourceBinding.sourceColorView,
|
||||
sourceBinding.sourceColorState,
|
||||
sourceBinding.sourceColor,
|
||||
&builder.blackboard);
|
||||
currentSourceColor = fullscreenBinding.sourceColor;
|
||||
return RecordStageSequencePasses(
|
||||
stageState.stage,
|
||||
stageState.surfaceTemplate,
|
||||
stagePassContext.sourceSurface,
|
||||
stagePassContext.sourceColorView,
|
||||
stagePassContext.sourceColorState,
|
||||
GetPrimaryColorTexture(stageState.sourceSurface),
|
||||
&builder.blackboard),
|
||||
stageState.outputColor,
|
||||
context.sceneData,
|
||||
stageState.stageSequence,
|
||||
builder.executionState,
|
||||
builder.graphBuilder,
|
||||
builder.stageExecutionSucceeded)
|
||||
: RecordRegularPassSequenceStage(
|
||||
stageState.stageName,
|
||||
stageState.stageSequence,
|
||||
builder.executionState,
|
||||
context.plan.request.context,
|
||||
builder.stageExecutionSucceeded,
|
||||
[&context, &stageState, &fullscreenBinding, ¤tSourceColor](
|
||||
RenderPass& pass,
|
||||
size_t passIndex,
|
||||
const Containers::String& passName,
|
||||
const RenderPassGraphBeginCallback& beginSequencePass) {
|
||||
return RecordCameraFrameFullscreenSequenceStageGraphPass(
|
||||
context,
|
||||
stageState,
|
||||
passName,
|
||||
fullscreenBinding,
|
||||
stageState.outputColor,
|
||||
passIndex,
|
||||
stageState.stageSequence->GetPassCount(),
|
||||
currentSourceColor,
|
||||
beginSequencePass,
|
||||
pass);
|
||||
});
|
||||
}()
|
||||
: RecordStageSequencePasses(
|
||||
stageState.stage,
|
||||
stageState.stageName,
|
||||
context,
|
||||
stageState,
|
||||
stagePassContext,
|
||||
stageState.outputSurface,
|
||||
context.sceneData,
|
||||
stageState.stageSequence,
|
||||
builder.executionState,
|
||||
builder.stageExecutionSucceeded);
|
||||
context.plan.request.context,
|
||||
builder.stageExecutionSucceeded,
|
||||
[&context, &stageState](
|
||||
RenderPass& pass,
|
||||
size_t,
|
||||
const Containers::String& passName,
|
||||
const RenderPassGraphBeginCallback& beginSequencePass) {
|
||||
return RecordCameraFrameRegularSequenceStageRenderGraphPass(
|
||||
context,
|
||||
stageState,
|
||||
passName,
|
||||
stageState.outputSurface,
|
||||
beginSequencePass,
|
||||
pass);
|
||||
});
|
||||
if (!recordResult) {
|
||||
Debug::Logger::Get().Error(
|
||||
Debug::LogCategory::Rendering,
|
||||
|
||||
Reference in New Issue
Block a user