Bridge managed render funcs to command buffers
This commit is contained in:
@@ -24,6 +24,7 @@
|
||||
#include <XCEngine/Rendering/Extraction/RenderSceneUtility.h>
|
||||
#include <XCEngine/Rendering/Graph/RenderGraph.h>
|
||||
#include <XCEngine/Rendering/Graph/RenderGraphCompiler.h>
|
||||
#include <XCEngine/Rendering/Graph/RenderGraphExecutor.h>
|
||||
#include <XCEngine/Rendering/Planning/SceneRenderRequestPlanner.h>
|
||||
#include <XCEngine/Rendering/Pipelines/BuiltinForwardPipeline.h>
|
||||
#include <XCEngine/Rendering/Pipelines/ManagedScriptableRenderPipelineAsset.h>
|
||||
@@ -4637,6 +4638,167 @@ TEST_F(
|
||||
recorder->Shutdown();
|
||||
}
|
||||
|
||||
TEST_F(
|
||||
MonoScriptRuntimeTest,
|
||||
ManagedRenderFuncExecutesDuringRenderGraphAndFlushesCommandBuffer) {
|
||||
Scene* runtimeScene =
|
||||
CreateScene("ManagedCommandBufferRenderFuncScene");
|
||||
GameObject* selectionObject =
|
||||
runtimeScene->CreateGameObject(
|
||||
"ManagedCommandBufferRenderFuncSelection");
|
||||
ScriptComponent* selectionScript =
|
||||
AddScript(
|
||||
selectionObject,
|
||||
"Gameplay",
|
||||
"ManagedCommandBufferRenderFuncRuntimeSelectionProbe");
|
||||
ASSERT_NE(selectionScript, nullptr);
|
||||
|
||||
engine->OnRuntimeStart(runtimeScene);
|
||||
engine->OnUpdate(0.016f);
|
||||
|
||||
int observedRenderFuncCallCount = -1;
|
||||
int observedClearSucceededCount = -1;
|
||||
ASSERT_TRUE(runtime->TryGetFieldValue(
|
||||
selectionScript,
|
||||
"ObservedRenderFuncCallCount",
|
||||
observedRenderFuncCallCount));
|
||||
ASSERT_TRUE(runtime->TryGetFieldValue(
|
||||
selectionScript,
|
||||
"ObservedClearSucceededCount",
|
||||
observedClearSucceededCount));
|
||||
ASSERT_EQ(observedRenderFuncCallCount, 0);
|
||||
ASSERT_EQ(observedClearSucceededCount, 0);
|
||||
|
||||
const auto bridge =
|
||||
XCEngine::Rendering::Pipelines::GetManagedRenderPipelineBridge();
|
||||
ASSERT_NE(bridge, nullptr);
|
||||
|
||||
const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetDescriptor descriptor = {
|
||||
"GameScripts",
|
||||
"Gameplay",
|
||||
"ManagedCommandBufferRenderFuncProbeAsset"
|
||||
};
|
||||
|
||||
std::shared_ptr<const XCEngine::Rendering::Pipelines::ManagedRenderPipelineAssetRuntime>
|
||||
assetRuntime = bridge->CreateAssetRuntime(descriptor);
|
||||
ASSERT_NE(assetRuntime, nullptr);
|
||||
std::unique_ptr<XCEngine::Rendering::RenderPipelineStageRecorder> recorder =
|
||||
assetRuntime->CreateStageRecorder();
|
||||
ASSERT_NE(recorder, nullptr);
|
||||
|
||||
TestRenderDevice device;
|
||||
TestRenderCommandList commandList;
|
||||
TestRenderCommandQueue commandQueue;
|
||||
const XCEngine::Rendering::RenderContext renderContext =
|
||||
CreateRenderContext(
|
||||
device,
|
||||
commandList,
|
||||
commandQueue);
|
||||
ASSERT_TRUE(recorder->Initialize(renderContext));
|
||||
ASSERT_TRUE(
|
||||
recorder->SupportsStageRenderGraph(
|
||||
XCEngine::Rendering::CameraFrameStage::MainScene));
|
||||
|
||||
XCEngine::Rendering::RenderGraph graph;
|
||||
XCEngine::Rendering::RenderGraphBuilder graphBuilder(graph);
|
||||
XCEngine::Rendering::RenderGraphTextureDesc colorDesc = {};
|
||||
colorDesc.width = 64u;
|
||||
colorDesc.height = 64u;
|
||||
colorDesc.format =
|
||||
static_cast<XCEngine::Core::uint32>(
|
||||
XCEngine::RHI::Format::R8G8B8A8_UNorm);
|
||||
const XCEngine::Rendering::RenderGraphTextureHandle colorTarget =
|
||||
graphBuilder.CreateTransientTexture(
|
||||
"ManagedCommandBufferRenderFuncColor",
|
||||
colorDesc);
|
||||
|
||||
const XCEngine::Rendering::RenderSceneData sceneData = {};
|
||||
const XCEngine::Rendering::RenderSurface surface(64u, 64u);
|
||||
bool executionSucceeded = true;
|
||||
XCEngine::Rendering::RenderGraphBlackboard blackboard = {};
|
||||
const XCEngine::Rendering::RenderPipelineStageRenderGraphContext graphContext = {
|
||||
graphBuilder,
|
||||
"ManagedCommandBufferRenderFunc",
|
||||
XCEngine::Rendering::CameraFrameStage::MainScene,
|
||||
renderContext,
|
||||
sceneData,
|
||||
surface,
|
||||
nullptr,
|
||||
nullptr,
|
||||
XCEngine::RHI::ResourceStates::Common,
|
||||
{},
|
||||
{ colorTarget },
|
||||
{},
|
||||
{},
|
||||
&executionSucceeded,
|
||||
&blackboard
|
||||
};
|
||||
|
||||
ASSERT_TRUE(recorder->RecordStageRenderGraph(graphContext))
|
||||
<< runtime->GetLastError();
|
||||
EXPECT_EQ(commandList.clearRenderTargetCalls, 0u);
|
||||
|
||||
engine->OnUpdate(0.016f);
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(
|
||||
selectionScript,
|
||||
"ObservedRenderFuncCallCount",
|
||||
observedRenderFuncCallCount));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(
|
||||
selectionScript,
|
||||
"ObservedClearSucceededCount",
|
||||
observedClearSucceededCount));
|
||||
EXPECT_EQ(observedRenderFuncCallCount, 0);
|
||||
EXPECT_EQ(observedClearSucceededCount, 0);
|
||||
|
||||
XCEngine::Rendering::CompiledRenderGraph compiledGraph = {};
|
||||
XCEngine::Containers::String errorMessage;
|
||||
ASSERT_TRUE(
|
||||
XCEngine::Rendering::RenderGraphCompiler::Compile(
|
||||
graph,
|
||||
compiledGraph,
|
||||
&errorMessage))
|
||||
<< errorMessage.CStr();
|
||||
ASSERT_EQ(compiledGraph.GetPassCount(), 1u);
|
||||
EXPECT_STREQ(
|
||||
compiledGraph.GetPassName(0).CStr(),
|
||||
"Managed.CommandBufferRenderFunc");
|
||||
|
||||
ASSERT_TRUE(
|
||||
XCEngine::Rendering::RenderGraphExecutor::Execute(
|
||||
compiledGraph,
|
||||
renderContext,
|
||||
&errorMessage))
|
||||
<< errorMessage.CStr();
|
||||
|
||||
EXPECT_EQ(commandList.clearRenderTargetCalls, 1u);
|
||||
EXPECT_NEAR(commandList.lastClearRenderTargetColor[0], 0.20f, 0.001f);
|
||||
EXPECT_NEAR(commandList.lastClearRenderTargetColor[1], 0.40f, 0.001f);
|
||||
EXPECT_NEAR(commandList.lastClearRenderTargetColor[2], 0.60f, 0.001f);
|
||||
EXPECT_NEAR(commandList.lastClearRenderTargetColor[3], 1.0f, 0.001f);
|
||||
|
||||
engine->OnUpdate(0.016f);
|
||||
XCEngine::Math::Vector4 observedLastClearColor = {};
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(
|
||||
selectionScript,
|
||||
"ObservedRenderFuncCallCount",
|
||||
observedRenderFuncCallCount));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(
|
||||
selectionScript,
|
||||
"ObservedClearSucceededCount",
|
||||
observedClearSucceededCount));
|
||||
EXPECT_TRUE(runtime->TryGetFieldValue(
|
||||
selectionScript,
|
||||
"ObservedLastClearColor",
|
||||
observedLastClearColor));
|
||||
EXPECT_EQ(observedRenderFuncCallCount, 1);
|
||||
EXPECT_EQ(observedClearSucceededCount, 1);
|
||||
ExpectVector4Near(
|
||||
observedLastClearColor,
|
||||
XCEngine::Math::Vector4(0.20f, 0.40f, 0.60f, 1.0f));
|
||||
|
||||
recorder->Shutdown();
|
||||
}
|
||||
|
||||
TEST_F(
|
||||
MonoScriptRuntimeTest,
|
||||
ManagedRenderPipelineAssetPlansFullscreenStagesFromRendererPassQueue) {
|
||||
|
||||
Reference in New Issue
Block a user