refactor(rendering): move fullscreen stage source binding into contract
This commit is contained in:
@@ -19,6 +19,41 @@ CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding(
|
||||
};
|
||||
}
|
||||
|
||||
CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding(
|
||||
const CameraFramePlan& plan,
|
||||
CameraFrameStage stage,
|
||||
const RenderSurface& stageSurfaceTemplate,
|
||||
const RenderSurface* explicitSourceSurfaceTemplate,
|
||||
RHI::RHIResourceView* explicitSourceColorView,
|
||||
const RHI::ResourceStates explicitSourceColorState,
|
||||
const RenderGraphTextureHandle explicitSourceColor,
|
||||
const RenderGraphBlackboard* blackboard) {
|
||||
CameraFrameRenderGraphSourceBinding binding = {};
|
||||
binding.sourceSurfaceTemplate = explicitSourceSurfaceTemplate;
|
||||
binding.sourceColorView = explicitSourceColorView;
|
||||
binding.sourceColorState = explicitSourceColorState;
|
||||
binding.sourceColor = explicitSourceColor;
|
||||
|
||||
const CameraFrameColorSource graphManagedSource =
|
||||
ResolveCameraFrameStageGraphManagedColorSource(plan, stage);
|
||||
if (graphManagedSource != CameraFrameColorSource::ExplicitSurface) {
|
||||
binding.sourceSurfaceTemplate = &stageSurfaceTemplate;
|
||||
binding.sourceColorView = nullptr;
|
||||
binding.sourceColorState = RHI::ResourceStates::PixelShaderResource;
|
||||
binding.sourceColor =
|
||||
ResolveCameraFrameRenderGraphColorSource(
|
||||
blackboard,
|
||||
graphManagedSource);
|
||||
}
|
||||
|
||||
if (binding.sourceSurfaceTemplate == nullptr &&
|
||||
binding.sourceColor.IsValid()) {
|
||||
binding.sourceSurfaceTemplate = &stageSurfaceTemplate;
|
||||
}
|
||||
|
||||
return binding;
|
||||
}
|
||||
|
||||
RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext(
|
||||
const CameraFrameRenderGraphStageContext& context,
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
|
||||
@@ -23,6 +23,16 @@ struct CameraFrameStageFallbackSurfaceResolution {
|
||||
CameraFrameRenderGraphSourceBinding BuildCameraFrameStageGraphSourceBinding(
|
||||
const CameraFrameStageGraphBuildState& stageState);
|
||||
|
||||
CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding(
|
||||
const CameraFramePlan& plan,
|
||||
CameraFrameStage stage,
|
||||
const RenderSurface& stageSurfaceTemplate,
|
||||
const RenderSurface* explicitSourceSurfaceTemplate,
|
||||
RHI::RHIResourceView* explicitSourceColorView,
|
||||
RHI::ResourceStates explicitSourceColorState,
|
||||
RenderGraphTextureHandle explicitSourceColor,
|
||||
const RenderGraphBlackboard* blackboard);
|
||||
|
||||
RenderGraphRecordingContext BuildCameraFrameStageGraphRecordingContext(
|
||||
const CameraFrameRenderGraphStageContext& context,
|
||||
const CameraFrameStageGraphBuildState& stageState,
|
||||
|
||||
@@ -52,40 +52,5 @@ inline CameraFrameColorSource ResolveCameraFrameStageGraphManagedColorSource(
|
||||
return plan.ResolveStageColorSource(stage);
|
||||
}
|
||||
|
||||
inline CameraFrameRenderGraphSourceBinding ResolveCameraFrameFullscreenStageGraphSourceBinding(
|
||||
const CameraFramePlan& plan,
|
||||
CameraFrameStage stage,
|
||||
const RenderSurface& stageSurfaceTemplate,
|
||||
const RenderSurface* explicitSourceSurfaceTemplate,
|
||||
RHI::RHIResourceView* explicitSourceColorView,
|
||||
RHI::ResourceStates explicitSourceColorState,
|
||||
RenderGraphTextureHandle explicitSourceColor,
|
||||
const RenderGraphBlackboard* blackboard) {
|
||||
CameraFrameRenderGraphSourceBinding binding = {};
|
||||
binding.sourceSurfaceTemplate = explicitSourceSurfaceTemplate;
|
||||
binding.sourceColorView = explicitSourceColorView;
|
||||
binding.sourceColorState = explicitSourceColorState;
|
||||
binding.sourceColor = explicitSourceColor;
|
||||
|
||||
const CameraFrameColorSource graphManagedSource =
|
||||
ResolveCameraFrameStageGraphManagedColorSource(plan, stage);
|
||||
if (graphManagedSource != CameraFrameColorSource::ExplicitSurface) {
|
||||
binding.sourceSurfaceTemplate = &stageSurfaceTemplate;
|
||||
binding.sourceColorView = nullptr;
|
||||
binding.sourceColorState = RHI::ResourceStates::PixelShaderResource;
|
||||
binding.sourceColor =
|
||||
ResolveCameraFrameRenderGraphColorSource(
|
||||
blackboard,
|
||||
graphManagedSource);
|
||||
}
|
||||
|
||||
if (binding.sourceSurfaceTemplate == nullptr &&
|
||||
binding.sourceColor.IsValid()) {
|
||||
binding.sourceSurfaceTemplate = &stageSurfaceTemplate;
|
||||
}
|
||||
|
||||
return binding;
|
||||
}
|
||||
|
||||
} // namespace Rendering
|
||||
} // namespace XCEngine
|
||||
|
||||
@@ -34,6 +34,15 @@ RenderGraphTextureHandle ImportTestTexture(
|
||||
{});
|
||||
}
|
||||
|
||||
RenderSurface CreateColorSurface(
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
XCEngine::RHI::RHIResourceView* colorAttachment) {
|
||||
RenderSurface surface(width, height);
|
||||
surface.SetColorAttachment(colorAttachment);
|
||||
return surface;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
TEST(CameraFrameRenderGraphStageContract_Test, BuildsSourceBindingFromStageState) {
|
||||
@@ -121,6 +130,88 @@ TEST(CameraFrameRenderGraphStageContract_Test, BuildsRecordingContextFromStageSt
|
||||
EXPECT_EQ(recordingContext.blackboard, &blackboard);
|
||||
}
|
||||
|
||||
TEST(CameraFrameRenderGraphStageContract_Test, KeepsExplicitFullscreenSourceBindingUntouched) {
|
||||
CameraFramePlan plan = {};
|
||||
RenderSurface stageSurface(320, 180);
|
||||
RenderSurface explicitSourceSurface =
|
||||
CreateColorSurface(
|
||||
320,
|
||||
180,
|
||||
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(11));
|
||||
XCEngine::RHI::RHIResourceView* const explicitSourceColorView =
|
||||
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(12);
|
||||
|
||||
const CameraFrameRenderGraphSourceBinding binding =
|
||||
ResolveCameraFrameFullscreenStageGraphSourceBinding(
|
||||
plan,
|
||||
CameraFrameStage::PostProcess,
|
||||
stageSurface,
|
||||
&explicitSourceSurface,
|
||||
explicitSourceColorView,
|
||||
XCEngine::RHI::ResourceStates::CopySrc,
|
||||
RenderGraphTextureHandle{ 21u },
|
||||
nullptr);
|
||||
|
||||
EXPECT_EQ(binding.sourceSurfaceTemplate, &explicitSourceSurface);
|
||||
EXPECT_EQ(binding.sourceColorView, explicitSourceColorView);
|
||||
EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::CopySrc);
|
||||
EXPECT_EQ(binding.sourceColor.index, 21u);
|
||||
}
|
||||
|
||||
TEST(CameraFrameRenderGraphStageContract_Test, ResolvesGraphManagedPostProcessSourceFromBlackboard) {
|
||||
CameraFramePlan plan = {};
|
||||
plan.colorChain.postProcess.source = CameraFrameColorSource::MainSceneColor;
|
||||
|
||||
RenderGraphBlackboard blackboard = {};
|
||||
CameraFrameRenderGraphResources& frameResources =
|
||||
EmplaceCameraFrameRenderGraphFrameData(blackboard).resources;
|
||||
frameResources.mainScene.color = RenderGraphTextureHandle{ 31u };
|
||||
|
||||
RenderSurface stageSurface(640, 360);
|
||||
const CameraFrameRenderGraphSourceBinding binding =
|
||||
ResolveCameraFrameFullscreenStageGraphSourceBinding(
|
||||
plan,
|
||||
CameraFrameStage::PostProcess,
|
||||
stageSurface,
|
||||
nullptr,
|
||||
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(41),
|
||||
XCEngine::RHI::ResourceStates::Common,
|
||||
{},
|
||||
&blackboard);
|
||||
|
||||
EXPECT_EQ(binding.sourceSurfaceTemplate, &stageSurface);
|
||||
EXPECT_EQ(binding.sourceColorView, nullptr);
|
||||
EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::PixelShaderResource);
|
||||
EXPECT_EQ(binding.sourceColor.index, 31u);
|
||||
}
|
||||
|
||||
TEST(CameraFrameRenderGraphStageContract_Test, ResolvesGraphManagedFinalOutputSourceFromBlackboard) {
|
||||
CameraFramePlan plan = {};
|
||||
plan.colorChain.finalOutput.source = CameraFrameColorSource::PostProcessColor;
|
||||
|
||||
RenderGraphBlackboard blackboard = {};
|
||||
CameraFrameRenderGraphResources& frameResources =
|
||||
EmplaceCameraFrameRenderGraphFrameData(blackboard).resources;
|
||||
frameResources.postProcess.color = RenderGraphTextureHandle{ 51u };
|
||||
|
||||
RenderSurface stageSurface(800, 600);
|
||||
const CameraFrameRenderGraphSourceBinding binding =
|
||||
ResolveCameraFrameFullscreenStageGraphSourceBinding(
|
||||
plan,
|
||||
CameraFrameStage::FinalOutput,
|
||||
stageSurface,
|
||||
nullptr,
|
||||
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(61),
|
||||
XCEngine::RHI::ResourceStates::Common,
|
||||
{},
|
||||
&blackboard);
|
||||
|
||||
EXPECT_EQ(binding.sourceSurfaceTemplate, &stageSurface);
|
||||
EXPECT_EQ(binding.sourceColorView, nullptr);
|
||||
EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::PixelShaderResource);
|
||||
EXPECT_EQ(binding.sourceColor.index, 51u);
|
||||
}
|
||||
|
||||
TEST(CameraFrameRenderGraphStageContract_Test, ResolvesFullscreenFallbackSurfaceOverrides) {
|
||||
CameraFrameStageGraphBuildState stageState = {};
|
||||
stageState.stage = CameraFrameStage::PostProcess;
|
||||
|
||||
@@ -4,19 +4,6 @@
|
||||
|
||||
using namespace XCEngine::Rendering;
|
||||
|
||||
namespace {
|
||||
|
||||
RenderSurface CreateColorSurface(
|
||||
uint32_t width,
|
||||
uint32_t height,
|
||||
XCEngine::RHI::RHIResourceView* colorAttachment) {
|
||||
RenderSurface surface(width, height);
|
||||
surface.SetColorAttachment(colorAttachment);
|
||||
return surface;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsStageFullscreenAndTransitionPolicies) {
|
||||
EXPECT_TRUE(IsCameraFrameFullscreenSequenceStage(CameraFrameStage::PostProcess));
|
||||
EXPECT_TRUE(IsCameraFrameFullscreenSequenceStage(CameraFrameStage::FinalOutput));
|
||||
@@ -40,85 +27,3 @@ TEST(CameraFrameRenderGraphStagePolicy_Test, ReportsGraphManagedOutputColorStage
|
||||
EXPECT_TRUE(UsesCameraFrameStageGraphManagedOutputColor(plan, CameraFrameStage::PostProcess));
|
||||
EXPECT_FALSE(UsesCameraFrameStageGraphManagedOutputColor(plan, CameraFrameStage::FinalOutput));
|
||||
}
|
||||
|
||||
TEST(CameraFrameRenderGraphStagePolicy_Test, KeepsExplicitFullscreenSourceBindingUntouched) {
|
||||
CameraFramePlan plan = {};
|
||||
RenderSurface stageSurface(320, 180);
|
||||
RenderSurface explicitSourceSurface =
|
||||
CreateColorSurface(
|
||||
320,
|
||||
180,
|
||||
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(11));
|
||||
XCEngine::RHI::RHIResourceView* const explicitSourceColorView =
|
||||
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(12);
|
||||
|
||||
const CameraFrameRenderGraphSourceBinding binding =
|
||||
ResolveCameraFrameFullscreenStageGraphSourceBinding(
|
||||
plan,
|
||||
CameraFrameStage::PostProcess,
|
||||
stageSurface,
|
||||
&explicitSourceSurface,
|
||||
explicitSourceColorView,
|
||||
XCEngine::RHI::ResourceStates::CopySrc,
|
||||
RenderGraphTextureHandle{ 21u },
|
||||
nullptr);
|
||||
|
||||
EXPECT_EQ(binding.sourceSurfaceTemplate, &explicitSourceSurface);
|
||||
EXPECT_EQ(binding.sourceColorView, explicitSourceColorView);
|
||||
EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::CopySrc);
|
||||
EXPECT_EQ(binding.sourceColor.index, 21u);
|
||||
}
|
||||
|
||||
TEST(CameraFrameRenderGraphStagePolicy_Test, ResolvesGraphManagedPostProcessSourceFromBlackboard) {
|
||||
CameraFramePlan plan = {};
|
||||
plan.colorChain.postProcess.source = CameraFrameColorSource::MainSceneColor;
|
||||
|
||||
RenderGraphBlackboard blackboard = {};
|
||||
CameraFrameRenderGraphResources& frameResources =
|
||||
EmplaceCameraFrameRenderGraphFrameData(blackboard).resources;
|
||||
frameResources.mainScene.color = RenderGraphTextureHandle{ 31u };
|
||||
|
||||
RenderSurface stageSurface(640, 360);
|
||||
const CameraFrameRenderGraphSourceBinding binding =
|
||||
ResolveCameraFrameFullscreenStageGraphSourceBinding(
|
||||
plan,
|
||||
CameraFrameStage::PostProcess,
|
||||
stageSurface,
|
||||
nullptr,
|
||||
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(41),
|
||||
XCEngine::RHI::ResourceStates::Common,
|
||||
{},
|
||||
&blackboard);
|
||||
|
||||
EXPECT_EQ(binding.sourceSurfaceTemplate, &stageSurface);
|
||||
EXPECT_EQ(binding.sourceColorView, nullptr);
|
||||
EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::PixelShaderResource);
|
||||
EXPECT_EQ(binding.sourceColor.index, 31u);
|
||||
}
|
||||
|
||||
TEST(CameraFrameRenderGraphStagePolicy_Test, ResolvesGraphManagedFinalOutputSourceFromBlackboard) {
|
||||
CameraFramePlan plan = {};
|
||||
plan.colorChain.finalOutput.source = CameraFrameColorSource::PostProcessColor;
|
||||
|
||||
RenderGraphBlackboard blackboard = {};
|
||||
CameraFrameRenderGraphResources& frameResources =
|
||||
EmplaceCameraFrameRenderGraphFrameData(blackboard).resources;
|
||||
frameResources.postProcess.color = RenderGraphTextureHandle{ 51u };
|
||||
|
||||
RenderSurface stageSurface(800, 600);
|
||||
const CameraFrameRenderGraphSourceBinding binding =
|
||||
ResolveCameraFrameFullscreenStageGraphSourceBinding(
|
||||
plan,
|
||||
CameraFrameStage::FinalOutput,
|
||||
stageSurface,
|
||||
nullptr,
|
||||
reinterpret_cast<XCEngine::RHI::RHIResourceView*>(61),
|
||||
XCEngine::RHI::ResourceStates::Common,
|
||||
{},
|
||||
&blackboard);
|
||||
|
||||
EXPECT_EQ(binding.sourceSurfaceTemplate, &stageSurface);
|
||||
EXPECT_EQ(binding.sourceColorView, nullptr);
|
||||
EXPECT_EQ(binding.sourceColorState, XCEngine::RHI::ResourceStates::PixelShaderResource);
|
||||
EXPECT_EQ(binding.sourceColor.index, 51u);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user