Extract camera frame render-graph stage state module
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
#include "Debug/Logger.h"
|
||||
#include "Rendering/Execution/CameraFrameRenderGraphStagePolicy.h"
|
||||
#include "Rendering/Execution/DirectionalShadowExecutionState.h"
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h"
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h"
|
||||
#include "Rendering/Graph/RenderGraph.h"
|
||||
#include "Rendering/Graph/RenderGraphCompiler.h"
|
||||
@@ -183,45 +184,6 @@ bool RecordSequencePass(
|
||||
: Internal::RecordRasterRenderPass(pass, context, io);
|
||||
}
|
||||
|
||||
const RenderSurface* ResolveFrameStageOutputSurface(
|
||||
CameraFrameStage stage,
|
||||
const CameraFramePlan& plan,
|
||||
const DirectionalShadowExecutionState& shadowState) {
|
||||
switch (stage) {
|
||||
case CameraFrameStage::ShadowCaster:
|
||||
return shadowState.shadowCasterRequest.IsRequested()
|
||||
? &shadowState.shadowCasterRequest.surface
|
||||
: nullptr;
|
||||
case CameraFrameStage::DepthOnly:
|
||||
return plan.request.depthOnly.IsRequested()
|
||||
? &plan.request.depthOnly.surface
|
||||
: nullptr;
|
||||
case CameraFrameStage::ObjectId:
|
||||
return plan.request.objectId.IsRequested()
|
||||
? &plan.request.objectId.surface
|
||||
: nullptr;
|
||||
default:
|
||||
return plan.GetOutputSurface(stage);
|
||||
}
|
||||
}
|
||||
|
||||
RenderPassContext BuildFrameStagePassContext(
|
||||
CameraFrameStage stage,
|
||||
const CameraFramePlan& plan,
|
||||
const DirectionalShadowExecutionState& shadowState,
|
||||
const RenderSceneData& sceneData) {
|
||||
const RenderSurface* outputSurface =
|
||||
ResolveFrameStageOutputSurface(stage, plan, shadowState);
|
||||
return {
|
||||
plan.request.context,
|
||||
outputSurface != nullptr ? *outputSurface : plan.request.surface,
|
||||
sceneData,
|
||||
plan.GetSourceSurface(stage),
|
||||
plan.GetSourceColorView(stage),
|
||||
plan.GetSourceColorState(stage)
|
||||
};
|
||||
}
|
||||
|
||||
bool ExecuteRecordedFrameStage(
|
||||
CameraFrameStage stage,
|
||||
const CameraFramePlan& plan,
|
||||
@@ -444,102 +406,6 @@ bool RecordFullscreenPassSequenceStage(
|
||||
return true;
|
||||
}
|
||||
|
||||
struct CameraFrameStageGraphBuildState {
|
||||
CameraFrameStage stage = CameraFrameStage::MainScene;
|
||||
Containers::String stageName = {};
|
||||
RenderPassSequence* stageSequence = nullptr;
|
||||
RenderSurface surfaceTemplate = {};
|
||||
bool hasSourceSurface = false;
|
||||
RenderSurface sourceSurfaceTemplate = {};
|
||||
RHI::RHIResourceView* sourceColorView = nullptr;
|
||||
RHI::ResourceStates sourceColorState = RHI::ResourceStates::Common;
|
||||
RenderGraphImportedSurface sourceSurface = {};
|
||||
RenderGraphImportedSurface outputSurface = {};
|
||||
RenderGraphTextureHandle outputColor = {};
|
||||
};
|
||||
|
||||
RenderPassContext BuildCameraFrameStageGraphPassContext(
|
||||
const CameraFramePlan& plan,
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const RenderSceneData& sceneData) {
|
||||
return {
|
||||
plan.request.context,
|
||||
stageState.surfaceTemplate,
|
||||
sceneData,
|
||||
stageState.hasSourceSurface
|
||||
? &stageState.sourceSurfaceTemplate
|
||||
: nullptr,
|
||||
stageState.sourceColorView,
|
||||
stageState.sourceColorState
|
||||
};
|
||||
}
|
||||
|
||||
CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState(
|
||||
CameraFrameStage stage,
|
||||
const CameraFramePlan& plan,
|
||||
const DirectionalShadowExecutionState& shadowState,
|
||||
const RenderSceneData& sceneData,
|
||||
RenderGraphBuilder& graphBuilder,
|
||||
RenderGraphImportedTextureRegistry& importedTextures) {
|
||||
CameraFrameStageGraphBuildState stageState = {};
|
||||
stageState.stage = stage;
|
||||
stageState.stageName = Containers::String(GetCameraFrameStageName(stage));
|
||||
stageState.stageSequence = plan.GetPassSequence(stage);
|
||||
|
||||
const RenderPassContext stagePassContext =
|
||||
BuildFrameStagePassContext(stage, plan, shadowState, sceneData);
|
||||
stageState.surfaceTemplate = stagePassContext.surface;
|
||||
stageState.hasSourceSurface = stagePassContext.sourceSurface != nullptr;
|
||||
if (stageState.hasSourceSurface) {
|
||||
stageState.sourceSurfaceTemplate = *stagePassContext.sourceSurface;
|
||||
}
|
||||
stageState.sourceColorView = stagePassContext.sourceColorView;
|
||||
stageState.sourceColorState = stagePassContext.sourceColorState;
|
||||
stageState.sourceSurface =
|
||||
ImportRenderGraphSurface(
|
||||
graphBuilder,
|
||||
importedTextures,
|
||||
stageState.stageName + ".Source",
|
||||
stagePassContext.sourceSurface,
|
||||
RenderGraphSurfaceImportUsage::Source,
|
||||
IsCameraFrameFullscreenSequenceStage(stage));
|
||||
stageState.outputSurface =
|
||||
ImportRenderGraphSurface(
|
||||
graphBuilder,
|
||||
importedTextures,
|
||||
stageState.stageName + ".Output",
|
||||
&stagePassContext.surface,
|
||||
RenderGraphSurfaceImportUsage::Output,
|
||||
DoesCameraFrameStageGraphOwnColorTransitions(stage),
|
||||
DoesCameraFrameStageGraphOwnDepthTransitions(stage));
|
||||
stageState.outputColor =
|
||||
ResolveStageOutputColorHandle(
|
||||
stage,
|
||||
plan,
|
||||
stageState.stageName,
|
||||
stagePassContext,
|
||||
stageState.outputSurface,
|
||||
graphBuilder);
|
||||
return stageState;
|
||||
}
|
||||
|
||||
void PublishCameraFrameStageGraphBuildState(
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const DirectionalShadowExecutionState& shadowState,
|
||||
CameraFrameRenderGraphResources& frameResources) {
|
||||
if (stageState.stage == CameraFrameStage::ShadowCaster &&
|
||||
shadowState.HasShadowSampling() &&
|
||||
stageState.outputSurface.depthTexture.IsValid()) {
|
||||
frameResources.mainDirectionalShadow = stageState.outputSurface.depthTexture;
|
||||
}
|
||||
|
||||
WriteCameraFrameRenderGraphStageSurfaceResources(
|
||||
frameResources,
|
||||
stageState.stage,
|
||||
stageState.outputColor,
|
||||
stageState.outputSurface.depthTexture);
|
||||
}
|
||||
|
||||
bool TryRecordCameraFrameStageSequence(
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const CameraFramePlan& plan,
|
||||
|
||||
@@ -0,0 +1,136 @@
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h"
|
||||
|
||||
#include "Rendering/Execution/CameraFrameRenderGraphResources.h"
|
||||
#include "Rendering/Execution/CameraFrameRenderGraphStagePolicy.h"
|
||||
#include "Rendering/Execution/DirectionalShadowExecutionState.h"
|
||||
|
||||
namespace XCEngine {
|
||||
namespace Rendering {
|
||||
|
||||
namespace {
|
||||
|
||||
const RenderSurface* ResolveFrameStageOutputSurface(
|
||||
CameraFrameStage stage,
|
||||
const CameraFramePlan& plan,
|
||||
const DirectionalShadowExecutionState& shadowState) {
|
||||
switch (stage) {
|
||||
case CameraFrameStage::ShadowCaster:
|
||||
return shadowState.shadowCasterRequest.IsRequested()
|
||||
? &shadowState.shadowCasterRequest.surface
|
||||
: nullptr;
|
||||
case CameraFrameStage::DepthOnly:
|
||||
return plan.request.depthOnly.IsRequested()
|
||||
? &plan.request.depthOnly.surface
|
||||
: nullptr;
|
||||
case CameraFrameStage::ObjectId:
|
||||
return plan.request.objectId.IsRequested()
|
||||
? &plan.request.objectId.surface
|
||||
: nullptr;
|
||||
default:
|
||||
return plan.GetOutputSurface(stage);
|
||||
}
|
||||
}
|
||||
|
||||
RenderPassContext BuildFrameStagePassContext(
|
||||
CameraFrameStage stage,
|
||||
const CameraFramePlan& plan,
|
||||
const DirectionalShadowExecutionState& shadowState,
|
||||
const RenderSceneData& sceneData) {
|
||||
const RenderSurface* outputSurface =
|
||||
ResolveFrameStageOutputSurface(stage, plan, shadowState);
|
||||
return {
|
||||
plan.request.context,
|
||||
outputSurface != nullptr ? *outputSurface : plan.request.surface,
|
||||
sceneData,
|
||||
plan.GetSourceSurface(stage),
|
||||
plan.GetSourceColorView(stage),
|
||||
plan.GetSourceColorState(stage)
|
||||
};
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
RenderPassContext BuildCameraFrameStageGraphPassContext(
|
||||
const CameraFramePlan& plan,
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const RenderSceneData& sceneData) {
|
||||
return {
|
||||
plan.request.context,
|
||||
stageState.surfaceTemplate,
|
||||
sceneData,
|
||||
stageState.hasSourceSurface
|
||||
? &stageState.sourceSurfaceTemplate
|
||||
: nullptr,
|
||||
stageState.sourceColorView,
|
||||
stageState.sourceColorState
|
||||
};
|
||||
}
|
||||
|
||||
CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState(
|
||||
CameraFrameStage stage,
|
||||
const CameraFramePlan& plan,
|
||||
const DirectionalShadowExecutionState& shadowState,
|
||||
const RenderSceneData& sceneData,
|
||||
RenderGraphBuilder& graphBuilder,
|
||||
RenderGraphImportedTextureRegistry& importedTextures) {
|
||||
CameraFrameStageGraphBuildState stageState = {};
|
||||
stageState.stage = stage;
|
||||
stageState.stageName = Containers::String(GetCameraFrameStageName(stage));
|
||||
stageState.stageSequence = plan.GetPassSequence(stage);
|
||||
|
||||
const RenderPassContext stagePassContext =
|
||||
BuildFrameStagePassContext(stage, plan, shadowState, sceneData);
|
||||
stageState.surfaceTemplate = stagePassContext.surface;
|
||||
stageState.hasSourceSurface = stagePassContext.sourceSurface != nullptr;
|
||||
if (stageState.hasSourceSurface) {
|
||||
stageState.sourceSurfaceTemplate = *stagePassContext.sourceSurface;
|
||||
}
|
||||
stageState.sourceColorView = stagePassContext.sourceColorView;
|
||||
stageState.sourceColorState = stagePassContext.sourceColorState;
|
||||
stageState.sourceSurface =
|
||||
ImportRenderGraphSurface(
|
||||
graphBuilder,
|
||||
importedTextures,
|
||||
stageState.stageName + ".Source",
|
||||
stagePassContext.sourceSurface,
|
||||
RenderGraphSurfaceImportUsage::Source,
|
||||
IsCameraFrameFullscreenSequenceStage(stage));
|
||||
stageState.outputSurface =
|
||||
ImportRenderGraphSurface(
|
||||
graphBuilder,
|
||||
importedTextures,
|
||||
stageState.stageName + ".Output",
|
||||
&stagePassContext.surface,
|
||||
RenderGraphSurfaceImportUsage::Output,
|
||||
DoesCameraFrameStageGraphOwnColorTransitions(stage),
|
||||
DoesCameraFrameStageGraphOwnDepthTransitions(stage));
|
||||
stageState.outputColor =
|
||||
ResolveStageOutputColorHandle(
|
||||
stage,
|
||||
plan,
|
||||
stageState.stageName,
|
||||
stagePassContext,
|
||||
stageState.outputSurface,
|
||||
graphBuilder);
|
||||
return stageState;
|
||||
}
|
||||
|
||||
void PublishCameraFrameStageGraphBuildState(
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const DirectionalShadowExecutionState& shadowState,
|
||||
CameraFrameRenderGraphResources& frameResources) {
|
||||
if (stageState.stage == CameraFrameStage::ShadowCaster &&
|
||||
shadowState.HasShadowSampling() &&
|
||||
stageState.outputSurface.depthTexture.IsValid()) {
|
||||
frameResources.mainDirectionalShadow = stageState.outputSurface.depthTexture;
|
||||
}
|
||||
|
||||
WriteCameraFrameRenderGraphStageSurfaceResources(
|
||||
frameResources,
|
||||
stageState.stage,
|
||||
stageState.outputColor,
|
||||
stageState.outputSurface.depthTexture);
|
||||
}
|
||||
|
||||
} // namespace Rendering
|
||||
} // namespace XCEngine
|
||||
@@ -0,0 +1,47 @@
|
||||
#pragma once
|
||||
|
||||
#include <XCEngine/Rendering/RenderPass.h>
|
||||
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h"
|
||||
|
||||
namespace XCEngine {
|
||||
namespace Rendering {
|
||||
|
||||
struct CameraFrameRenderGraphResources;
|
||||
struct DirectionalShadowExecutionState;
|
||||
class RenderGraphBuilder;
|
||||
|
||||
struct CameraFrameStageGraphBuildState {
|
||||
CameraFrameStage stage = CameraFrameStage::MainScene;
|
||||
Containers::String stageName = {};
|
||||
RenderPassSequence* stageSequence = nullptr;
|
||||
RenderSurface surfaceTemplate = {};
|
||||
bool hasSourceSurface = false;
|
||||
RenderSurface sourceSurfaceTemplate = {};
|
||||
RHI::RHIResourceView* sourceColorView = nullptr;
|
||||
RHI::ResourceStates sourceColorState = RHI::ResourceStates::Common;
|
||||
RenderGraphImportedSurface sourceSurface = {};
|
||||
RenderGraphImportedSurface outputSurface = {};
|
||||
RenderGraphTextureHandle outputColor = {};
|
||||
};
|
||||
|
||||
RenderPassContext BuildCameraFrameStageGraphPassContext(
|
||||
const CameraFramePlan& plan,
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const RenderSceneData& sceneData);
|
||||
|
||||
CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState(
|
||||
CameraFrameStage stage,
|
||||
const CameraFramePlan& plan,
|
||||
const DirectionalShadowExecutionState& shadowState,
|
||||
const RenderSceneData& sceneData,
|
||||
RenderGraphBuilder& graphBuilder,
|
||||
RenderGraphImportedTextureRegistry& importedTextures);
|
||||
|
||||
void PublishCameraFrameStageGraphBuildState(
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const DirectionalShadowExecutionState& shadowState,
|
||||
CameraFrameRenderGraphResources& frameResources);
|
||||
|
||||
} // namespace Rendering
|
||||
} // namespace XCEngine
|
||||
Reference in New Issue
Block a user