refactor(rendering): move stage resource publication into contract
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphBuilderContext.h"
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRuntime.h"
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphSurfaceUtils.h"
|
||||
#include "Rendering/Execution/DirectionalShadowExecutionState.h"
|
||||
#include "Rendering/Graph/RenderGraph.h"
|
||||
#include <XCEngine/Rendering/RenderPassGraphContract.h>
|
||||
#include <XCEngine/Rendering/Graph/RenderGraphRecordingContext.h>
|
||||
@@ -35,6 +36,23 @@ CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding(
|
||||
};
|
||||
}
|
||||
|
||||
void PublishCameraFrameStageGraphResources(
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const CameraFrameRenderGraphStageContext& context) {
|
||||
CameraFrameRenderGraphResources& frameResources = context.builder.frameData.resources;
|
||||
WriteCameraFrameRenderGraphStageSurfaceResources(
|
||||
frameResources,
|
||||
stageState.stage,
|
||||
stageState.outputColor,
|
||||
stageState.outputSurface.depthTexture);
|
||||
|
||||
if (stageState.stage == CameraFrameStage::ShadowCaster &&
|
||||
context.shadowState.HasShadowSampling() &&
|
||||
stageState.outputSurface.depthTexture.IsValid()) {
|
||||
frameResources.mainDirectionalShadow = stageState.outputSurface.depthTexture;
|
||||
}
|
||||
}
|
||||
|
||||
RenderPassContext BuildCameraFrameStageGraphPassContext(
|
||||
const CameraFrameRenderGraphStageContext& context,
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
|
||||
@@ -23,6 +23,10 @@ struct CameraFrameStageFallbackSurfaceResolution {
|
||||
CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding(
|
||||
const CameraFrameStageGraphBuildState& stageState);
|
||||
|
||||
void PublishCameraFrameStageGraphResources(
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const CameraFrameRenderGraphStageContext& context);
|
||||
|
||||
RenderPassContext BuildCameraFrameStageGraphPassContext(
|
||||
const CameraFrameRenderGraphStageContext& context,
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageDispatch.h"
|
||||
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageContract.h"
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePassRecording.h"
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageSequenceRecording.h"
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h"
|
||||
@@ -31,7 +32,7 @@ bool RecordCameraFrameRenderGraphStage(
|
||||
BuildCameraFrameStageGraphBuildState(
|
||||
stage,
|
||||
context);
|
||||
PublishCameraFrameStageGraphBuildState(stageState, context);
|
||||
PublishCameraFrameStageGraphResources(stageState, context);
|
||||
|
||||
for (CameraFrameStageRecordHandler handler : kCameraFrameStageRecordHandlers) {
|
||||
bool stageHandled = false;
|
||||
|
||||
@@ -1,10 +1,7 @@
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStageState.h"
|
||||
|
||||
#include <XCEngine/Rendering/Execution/CameraFrameRenderGraphFrameData.h>
|
||||
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphBuilderContext.h"
|
||||
#include "Rendering/Execution/Internal/CameraFrameRenderGraphStagePolicy.h"
|
||||
#include "Rendering/Execution/DirectionalShadowExecutionState.h"
|
||||
#include "Rendering/Execution/Internal/CameraFrameStageSurfaceResolver.h"
|
||||
|
||||
namespace XCEngine {
|
||||
@@ -59,22 +56,5 @@ CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState(
|
||||
return stageState;
|
||||
}
|
||||
|
||||
void PublishCameraFrameStageGraphBuildState(
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const CameraFrameRenderGraphStageContext& context) {
|
||||
CameraFrameRenderGraphResources& frameResources = context.builder.frameData.resources;
|
||||
if (stageState.stage == CameraFrameStage::ShadowCaster &&
|
||||
context.shadowState.HasShadowSampling() &&
|
||||
stageState.outputSurface.depthTexture.IsValid()) {
|
||||
frameResources.mainDirectionalShadow = stageState.outputSurface.depthTexture;
|
||||
}
|
||||
|
||||
WriteCameraFrameRenderGraphStageSurfaceResources(
|
||||
frameResources,
|
||||
stageState.stage,
|
||||
stageState.outputColor,
|
||||
stageState.outputSurface.depthTexture);
|
||||
}
|
||||
|
||||
} // namespace Rendering
|
||||
} // namespace XCEngine
|
||||
|
||||
@@ -27,9 +27,5 @@ CameraFrameStageGraphBuildState BuildCameraFrameStageGraphBuildState(
|
||||
CameraFrameStage stage,
|
||||
const CameraFrameRenderGraphStageContext& context);
|
||||
|
||||
void PublishCameraFrameStageGraphBuildState(
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
const CameraFrameRenderGraphStageContext& context);
|
||||
|
||||
} // namespace Rendering
|
||||
} // namespace XCEngine
|
||||
|
||||
@@ -209,6 +209,121 @@ TEST(CameraFrameRenderGraphStageContract_Test, BuildsPassContextFromStageState)
|
||||
XCEngine::RHI::ResourceStates::PixelShaderResource);
|
||||
}
|
||||
|
||||
TEST(CameraFrameRenderGraphStageContract_Test, PublishesStageSurfaceResourcesIntoFrameData) {
|
||||
RenderGraph graph = {};
|
||||
RenderGraphBuilder graphBuilder(graph);
|
||||
RenderGraphBlackboard blackboard = {};
|
||||
CameraFrameRenderGraphFrameData& frameData =
|
||||
EmplaceCameraFrameRenderGraphFrameData(blackboard);
|
||||
RenderGraphImportedTextureRegistry importedTextures = {};
|
||||
CameraFrameExecutionState executionState = {};
|
||||
bool stageExecutionSucceeded = true;
|
||||
CameraFrameRenderGraphBuilderContext builderContext = {
|
||||
graphBuilder,
|
||||
blackboard,
|
||||
frameData,
|
||||
importedTextures,
|
||||
executionState,
|
||||
stageExecutionSucceeded
|
||||
};
|
||||
CameraFramePlan plan = {};
|
||||
DirectionalShadowExecutionState shadowState = {};
|
||||
RenderSceneData sceneData = {};
|
||||
const CameraFrameRenderGraphStageContext context = {
|
||||
plan,
|
||||
shadowState,
|
||||
sceneData,
|
||||
builderContext
|
||||
};
|
||||
|
||||
CameraFrameStageGraphBuildState stageState = {};
|
||||
stageState.stage = CameraFrameStage::MainScene;
|
||||
stageState.outputColor = RenderGraphTextureHandle{ 91u };
|
||||
stageState.outputSurface.depthTexture = RenderGraphTextureHandle{ 92u };
|
||||
|
||||
PublishCameraFrameStageGraphResources(stageState, context);
|
||||
|
||||
EXPECT_EQ(frameData.resources.mainScene.color.index, 91u);
|
||||
EXPECT_EQ(frameData.resources.mainScene.depth.index, 92u);
|
||||
EXPECT_FALSE(frameData.resources.mainDirectionalShadow.IsValid());
|
||||
}
|
||||
|
||||
TEST(CameraFrameRenderGraphStageContract_Test, PublishesShadowCasterDepthAliasOnlyWhenShadowSamplingIsValid) {
|
||||
RenderGraph graph = {};
|
||||
RenderGraphBuilder graphBuilder(graph);
|
||||
RenderGraphBlackboard blackboard = {};
|
||||
CameraFrameRenderGraphFrameData& frameData =
|
||||
EmplaceCameraFrameRenderGraphFrameData(blackboard);
|
||||
RenderGraphImportedTextureRegistry importedTextures = {};
|
||||
CameraFrameExecutionState executionState = {};
|
||||
bool stageExecutionSucceeded = true;
|
||||
CameraFrameRenderGraphBuilderContext builderContext = {
|
||||
graphBuilder,
|
||||
blackboard,
|
||||
frameData,
|
||||
importedTextures,
|
||||
executionState,
|
||||
stageExecutionSucceeded
|
||||
};
|
||||
CameraFramePlan plan = {};
|
||||
DirectionalShadowExecutionState shadowState = {};
|
||||
shadowState.shadowData.enabled = true;
|
||||
shadowState.shadowData.shadowMap =
|
||||
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(101);
|
||||
RenderSceneData sceneData = {};
|
||||
const CameraFrameRenderGraphStageContext context = {
|
||||
plan,
|
||||
shadowState,
|
||||
sceneData,
|
||||
builderContext
|
||||
};
|
||||
|
||||
CameraFrameStageGraphBuildState stageState = {};
|
||||
stageState.stage = CameraFrameStage::ShadowCaster;
|
||||
stageState.outputSurface.depthTexture = RenderGraphTextureHandle{ 102u };
|
||||
|
||||
PublishCameraFrameStageGraphResources(stageState, context);
|
||||
|
||||
EXPECT_EQ(frameData.resources.mainDirectionalShadow.index, 102u);
|
||||
EXPECT_FALSE(frameData.resources.mainScene.depth.IsValid());
|
||||
}
|
||||
|
||||
TEST(CameraFrameRenderGraphStageContract_Test, DoesNotPublishShadowCasterDepthAliasWithoutValidShadowSampling) {
|
||||
RenderGraph graph = {};
|
||||
RenderGraphBuilder graphBuilder(graph);
|
||||
RenderGraphBlackboard blackboard = {};
|
||||
CameraFrameRenderGraphFrameData& frameData =
|
||||
EmplaceCameraFrameRenderGraphFrameData(blackboard);
|
||||
RenderGraphImportedTextureRegistry importedTextures = {};
|
||||
CameraFrameExecutionState executionState = {};
|
||||
bool stageExecutionSucceeded = true;
|
||||
CameraFrameRenderGraphBuilderContext builderContext = {
|
||||
graphBuilder,
|
||||
blackboard,
|
||||
frameData,
|
||||
importedTextures,
|
||||
executionState,
|
||||
stageExecutionSucceeded
|
||||
};
|
||||
CameraFramePlan plan = {};
|
||||
DirectionalShadowExecutionState shadowState = {};
|
||||
RenderSceneData sceneData = {};
|
||||
const CameraFrameRenderGraphStageContext context = {
|
||||
plan,
|
||||
shadowState,
|
||||
sceneData,
|
||||
builderContext
|
||||
};
|
||||
|
||||
CameraFrameStageGraphBuildState stageState = {};
|
||||
stageState.stage = CameraFrameStage::ShadowCaster;
|
||||
stageState.outputSurface.depthTexture = RenderGraphTextureHandle{ 111u };
|
||||
|
||||
PublishCameraFrameStageGraphResources(stageState, context);
|
||||
|
||||
EXPECT_FALSE(frameData.resources.mainDirectionalShadow.IsValid());
|
||||
}
|
||||
|
||||
TEST(CameraFrameRenderGraphStageContract_Test, BuildsRecordingContextFromStageStateAndOverrides) {
|
||||
RenderGraph graph = {};
|
||||
RenderGraphBuilder graphBuilder(graph);
|
||||
|
||||
Reference in New Issue
Block a user