You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/Atom/RPI/Code/Tests/System/RenderPipelineTests.cpp

172 lines
6.2 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <Atom/RPI.Public/Base.h>
#include <Atom/RPI.Public/RenderPipeline.h>
#include <Atom/RPI.Public/View.h>
#include <AzTest/AzTest.h>
#include <Common/RPITestFixture.h>
#include <Common/SerializeTester.h>
#include <Common/ErrorMessageFinder.h>
namespace UnitTest
{
using namespace AZ;
class RenderPipelineTests
: public RPITestFixture
{
protected:
// A test pass which only include view tag and draw list tag
class TestPass
: public AZ::RPI::ParentPass
{
public:
AZ_RTTI(TestPass, "{2056532E-286F-454F-8659-15A289432A63}", AZ::RPI::ParentPass);
AZ_CLASS_ALLOCATOR(TestPass, AZ::SystemAllocator, 0);
TestPass(const AZ::RPI::PassDescriptor& descriptor)
: AZ::RPI::ParentPass(descriptor)
{ }
void Initialize(const Name& drawListTagString, const AZ::RPI::PipelineViewTag& viewTag)
{
RHI::DrawListTagRegistry* drawListTagRegistry = RHI::RHISystemInterface::Get()->GetDrawListTagRegistry();
m_drawListTag = drawListTagRegistry->AcquireTag(drawListTagString);
m_viewTag = viewTag;
m_flags.m_hasDrawListTag = true;
m_flags.m_hasPipelineViewTag = true;
}
AZ::RHI::DrawListTag GetDrawListTag() const override
{
return m_drawListTag;
}
const AZ::RPI::PipelineViewTag& GetPipelineViewTag() const override
{
return m_viewTag;
}
virtual ~TestPass()
{
if (m_drawListTag.IsValid())
{
RHI::DrawListTagRegistry* drawListTagRegistry = RHI::RHISystemInterface::Get()->GetDrawListTagRegistry();
drawListTagRegistry->ReleaseTag(m_drawListTag);
}
}
private:
AZ::RHI::DrawListTag m_drawListTag;
AZ::RPI::PipelineViewTag m_viewTag;
};
};
/**
* Validate view and view tag related functions
*/
TEST_F(RenderPipelineTests, ViewFunctionsTest)
{
using namespace AZ;
RHI::DrawListTagRegistry* drawListTagRegistry = RHI::RHISystemInterface::Get()->GetDrawListTagRegistry();
const RPI::PipelineViewTag viewTag1{ "viewTag1" };
const RPI::PipelineViewTag viewTag2{ "viewTag2" };
const Name drawListTagString1{ "drawListTag1" };
const Name drawListTagString2{ "drawListTag2" };
// Create render pipeline
RPI::RenderPipelineDescriptor desc;
desc.m_mainViewTagName = viewTag2.GetStringView();
desc.m_name = "TestPipeline";
RPI::RenderPipelinePtr pipeline = RPI::RenderPipeline::CreateRenderPipeline(desc);
auto& rootPass = pipeline->GetRootPass();
AZ::RPI::PassDescriptor passDescriptor;
passDescriptor.m_passName = "TestPassA";
RPI::Ptr<TestPass> testPassA = aznew TestPass(passDescriptor);
testPassA->Initialize(drawListTagString1, viewTag1);
passDescriptor.m_passName = "TestPassB";
RPI::Ptr<TestPass> testPassB = aznew TestPass(passDescriptor);
testPassB->Initialize(drawListTagString1, viewTag2);
passDescriptor.m_passName = "TestPassC";
RPI::Ptr<TestPass> testPassC = aznew TestPass(passDescriptor);
testPassC->Initialize(drawListTagString2, viewTag2);
EXPECT_TRUE(testPassA->HasDrawListTag());
EXPECT_TRUE(testPassB->HasDrawListTag());
EXPECT_TRUE(testPassC->HasDrawListTag());
RHI::DrawListTag drawListTag1 = drawListTagRegistry->FindTag(drawListTagString1);
RHI::DrawListTag drawListTag2 = drawListTagRegistry->FindTag(drawListTagString2);
EXPECT_TRUE(testPassA->GetDrawListTag() == drawListTag1);
EXPECT_TRUE(testPassB->GetDrawListTag() == drawListTag1);
EXPECT_TRUE(testPassC->GetDrawListTag() == drawListTag2);
rootPass->AddChild(testPassA);
testPassA->AddChild(testPassB);
testPassA->AddChild(testPassC);
pipeline->OnPassModified();
EXPECT_TRUE(pipeline->HasViewTag(viewTag1));
auto& views = pipeline->GetViews(viewTag2);
EXPECT_TRUE(views.size() == 0);
RHI::DrawListMask drawListMask;
RPI::PassesByDrawList passesByDrawList;
// viewTag1 only associates with drawListTag1
rootPass->GetViewDrawListInfo(drawListMask, passesByDrawList, viewTag1);
EXPECT_TRUE(drawListMask[drawListTag1.GetIndex()] == true);
EXPECT_TRUE(drawListMask[drawListTag2.GetIndex()] == false);
rootPass->GetViewDrawListInfo(drawListMask, passesByDrawList, viewTag2);
// viewTag2 associates with drawlistTag1 and drawListTag2
EXPECT_TRUE(drawListMask[drawListTag1.GetIndex()] == true);
EXPECT_TRUE(drawListMask[drawListTag2.GetIndex()] == true);
// View functions
RPI::ViewPtr view1 = RPI::View::CreateView(AZ::Name("testViewA"), RPI::View::UsageCamera);
RPI::ViewPtr view2 = RPI::View::CreateView(AZ::Name("testViewB"), RPI::View::UsageCamera);
// Persistent view
pipeline->SetPersistentView(viewTag1, view1);
EXPECT_TRUE(pipeline->GetViews(viewTag1).size() == 1);
pipeline->SetPersistentView(viewTag1, view2);
auto& viewsFromTag1 = pipeline->GetViews(viewTag1);
EXPECT_TRUE(viewsFromTag1.size() == 1);
EXPECT_TRUE(view2 == viewsFromTag1[0]);
// Try to add a transient view to view tag was associated with persistent view.
AZ_TEST_START_ASSERTTEST;
pipeline->AddTransientView(viewTag1, view1);
AZ_TEST_STOP_ASSERTTEST(1);
EXPECT_TRUE(pipeline->GetViews(viewTag1).size() == 1);
// Transient view
pipeline->AddTransientView(viewTag2, view1);
pipeline->AddTransientView(viewTag2, view2);
auto& viewsFromTag2 = pipeline->GetViews(viewTag2);
EXPECT_TRUE(viewsFromTag2.size() == 2);
}
} // namespace UnitTest