Graph-manage single-pass fullscreen stages
This commit is contained in:
@@ -617,6 +617,8 @@ const RenderSurface* ResolveFrameStageOutputSurface(
|
||||
bool ShouldGraphOwnStageColorTransitions(
|
||||
CameraFrameStage stage) {
|
||||
return stage == CameraFrameStage::MainScene ||
|
||||
stage == CameraFrameStage::PostProcess ||
|
||||
stage == CameraFrameStage::FinalOutput ||
|
||||
stage == CameraFrameStage::ObjectId;
|
||||
}
|
||||
|
||||
@@ -685,20 +687,13 @@ bool ExecuteFrameStage(
|
||||
const DirectionalShadowExecutionState& shadowState,
|
||||
const RenderSceneData& sceneData,
|
||||
CameraFrameExecutionState& executionState,
|
||||
const RenderSurface* outputSurfaceOverride = nullptr) {
|
||||
const RenderPassContext* passContextOverride = nullptr) {
|
||||
const RenderPassContext defaultPassContext =
|
||||
BuildFrameStagePassContext(stage, plan, shadowState, sceneData);
|
||||
const RenderPassContext overridePassContext = {
|
||||
defaultPassContext.renderContext,
|
||||
outputSurfaceOverride != nullptr
|
||||
? *outputSurfaceOverride
|
||||
: defaultPassContext.surface,
|
||||
defaultPassContext.sceneData,
|
||||
defaultPassContext.sourceSurface,
|
||||
defaultPassContext.sourceColorView,
|
||||
defaultPassContext.sourceColorState
|
||||
};
|
||||
const RenderPassContext& passContext = overridePassContext;
|
||||
const RenderPassContext& passContext =
|
||||
passContextOverride != nullptr
|
||||
? *passContextOverride
|
||||
: defaultPassContext;
|
||||
|
||||
switch (stage) {
|
||||
case CameraFrameStage::PreScenePasses:
|
||||
@@ -713,14 +708,14 @@ bool ExecuteFrameStage(
|
||||
shadowState.shadowCasterRequest,
|
||||
plan.request.context,
|
||||
sceneData,
|
||||
outputSurfaceOverride);
|
||||
passContextOverride != nullptr ? &passContext.surface : nullptr);
|
||||
case CameraFrameStage::DepthOnly:
|
||||
return ExecuteScenePassRequest(
|
||||
executionState.depthOnlyPass,
|
||||
plan.request.depthOnly,
|
||||
plan.request.context,
|
||||
sceneData,
|
||||
outputSurfaceOverride);
|
||||
passContextOverride != nullptr ? &passContext.surface : nullptr);
|
||||
case CameraFrameStage::MainScene:
|
||||
return executionState.pipeline != nullptr &&
|
||||
executionState.pipeline->Render(
|
||||
@@ -750,9 +745,7 @@ bool ExecuteFrameStage(
|
||||
ExecuteStandalonePass(
|
||||
executionState.objectIdPass,
|
||||
plan.request.context,
|
||||
outputSurfaceOverride != nullptr
|
||||
? *outputSurfaceOverride
|
||||
: plan.request.objectId.surface,
|
||||
passContext.surface,
|
||||
sceneData);
|
||||
case CameraFrameStage::PostScenePasses:
|
||||
return ExecutePassSequenceStage(
|
||||
@@ -887,7 +880,8 @@ bool ExecuteRenderGraphPlan(
|
||||
importedTextures,
|
||||
stageName + ".Source",
|
||||
stagePassContext.sourceSurface,
|
||||
RenderGraphSurfaceImportUsage::Source);
|
||||
RenderGraphSurfaceImportUsage::Source,
|
||||
IsFullscreenSequenceStage(stage));
|
||||
const RenderGraphImportedSurface outputSurface =
|
||||
ImportRenderGraphSurface(
|
||||
graphBuilder,
|
||||
@@ -898,10 +892,17 @@ bool ExecuteRenderGraphPlan(
|
||||
ShouldGraphOwnStageColorTransitions(stage),
|
||||
ShouldGraphOwnStageDepthTransitions(stage));
|
||||
const RenderSurface stageSurfaceTemplate = stagePassContext.surface;
|
||||
const bool hasStageSourceSurface = stagePassContext.sourceSurface != nullptr;
|
||||
const RenderSurface stageSourceSurfaceTemplate =
|
||||
hasStageSourceSurface
|
||||
? *stagePassContext.sourceSurface
|
||||
: RenderSurface();
|
||||
const RHI::RHIResourceView* const stageSourceColorView = stagePassContext.sourceColorView;
|
||||
const RHI::ResourceStates stageSourceColorState = stagePassContext.sourceColorState;
|
||||
|
||||
graphBuilder.AddRasterPass(
|
||||
stageName,
|
||||
[&, sourceSurface, outputSurface, stage, stageSurfaceTemplate](
|
||||
[&, sourceSurface, outputSurface, stage, stageSurfaceTemplate, hasStageSourceSurface, stageSourceSurfaceTemplate, stageSourceColorView, stageSourceColorState](
|
||||
RenderGraphPassBuilder& passBuilder) {
|
||||
if (IsFullscreenSequenceStage(stage)) {
|
||||
ReadRenderGraphColorSurface(passBuilder, sourceSurface);
|
||||
@@ -911,27 +912,55 @@ bool ExecuteRenderGraphPlan(
|
||||
WriteRenderGraphSurface(passBuilder, outputSurface);
|
||||
}
|
||||
passBuilder.SetExecuteCallback(
|
||||
[&, stage, outputSurface, stageSurfaceTemplate](
|
||||
[&, stage, sourceSurface, outputSurface, stageSurfaceTemplate, hasStageSourceSurface, stageSourceSurfaceTemplate, stageSourceColorView, stageSourceColorState](
|
||||
const RenderGraphExecutionContext& executionContext) {
|
||||
if (!stageExecutionSucceeded) {
|
||||
return;
|
||||
}
|
||||
|
||||
const RenderSurface* outputSurfaceOverride = nullptr;
|
||||
const RenderSurface* resolvedSourceSurface =
|
||||
hasStageSourceSurface
|
||||
? &stageSourceSurfaceTemplate
|
||||
: nullptr;
|
||||
RHI::RHIResourceView* resolvedSourceColorView =
|
||||
const_cast<RHI::RHIResourceView*>(stageSourceColorView);
|
||||
RHI::ResourceStates resolvedSourceColorState = stageSourceColorState;
|
||||
RenderSurface graphManagedSourceSurface = {};
|
||||
if (IsFullscreenSequenceStage(stage) &&
|
||||
hasStageSourceSurface &&
|
||||
CanUseGraphManagedImportedSurface(sourceSurface, executionContext)) {
|
||||
graphManagedSourceSurface =
|
||||
BuildGraphManagedImportedSurface(
|
||||
stageSourceSurfaceTemplate,
|
||||
RHI::ResourceStates::PixelShaderResource,
|
||||
RHI::ResourceStates::PixelShaderResource);
|
||||
resolvedSourceSurface = &graphManagedSourceSurface;
|
||||
resolvedSourceColorState = RHI::ResourceStates::PixelShaderResource;
|
||||
}
|
||||
|
||||
const RenderSurface* resolvedOutputSurface = &stageSurfaceTemplate;
|
||||
RenderSurface graphManagedOutputSurface = {};
|
||||
if (CanUseGraphManagedImportedSurface(outputSurface, executionContext)) {
|
||||
graphManagedOutputSurface =
|
||||
BuildGraphManagedPassSurface(stageSurfaceTemplate);
|
||||
outputSurfaceOverride = &graphManagedOutputSurface;
|
||||
resolvedOutputSurface = &graphManagedOutputSurface;
|
||||
}
|
||||
|
||||
const RenderPassContext passContextOverride = {
|
||||
plan.request.context,
|
||||
*resolvedOutputSurface,
|
||||
sceneData,
|
||||
resolvedSourceSurface,
|
||||
resolvedSourceColorView,
|
||||
resolvedSourceColorState
|
||||
};
|
||||
stageExecutionSucceeded = ExecuteFrameStage(
|
||||
stage,
|
||||
plan,
|
||||
shadowState,
|
||||
sceneData,
|
||||
executionState,
|
||||
outputSurfaceOverride);
|
||||
&passContextOverride);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user