From c84882869bc57887d7e534e803a0c006d516d9fd Mon Sep 17 00:00:00 2001 From: Doug McDiarmid Date: Fri, 28 May 2021 03:41:44 -0700 Subject: [PATCH] Changed to a fixed-size occlusion buffer --- .../Code/Include/Atom/RPI.Public/Culling.h | 2 +- .../RPI/Code/Include/Atom/RPI.Public/View.h | 2 +- .../RPI/Code/Source/RPI.Public/Culling.cpp | 4 +- .../Atom/RPI/Code/Source/RPI.Public/Scene.cpp | 2 +- Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp | 50 ++----------------- 5 files changed, 9 insertions(+), 51 deletions(-) diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Culling.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Culling.h index 17e0a1f82d..8892266683 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Culling.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/Culling.h @@ -217,7 +217,7 @@ namespace AZ void SetOcclusionCullingPlanes(const AZStd::vector& occlusionCullingPlanes) { m_occlusionCullingPlanes = occlusionCullingPlanes; } //! Notifies the CullingScene that culling will begin for this frame. - void BeginCulling(const AZStd::vector& views, const AZStd::vector& activePipelines); + void BeginCulling(const AZStd::vector& views); //! Notifies the CullingScene that the culling is done for this frame. void EndCulling(); diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h index 74c841d2a5..0b6b41c8b0 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/View.h @@ -128,7 +128,7 @@ namespace AZ void ConnectWorldToClipMatrixChangedHandler(MatrixChangedEvent::Handler& handler); //! Prepare for view culling - void BeginCulling(const AZStd::vector& activePipelines); + void BeginCulling(); //! Returns the masked occlusion culling interface MaskedOcclusionCulling* GetMaskedOcclusionCulling(); diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Culling.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Culling.cpp index ab25fb14fb..7bed2d3232 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Culling.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Culling.cpp @@ -643,7 +643,7 @@ namespace AZ } } - void CullingScene::BeginCulling(const AZStd::vector& views, const AZStd::vector& activePipelines) + void CullingScene::BeginCulling(const AZStd::vector& views) { m_cullDataConcurrencyCheck.soft_lock(); @@ -652,7 +652,7 @@ namespace AZ for (auto& view : views) { - view->BeginCulling(activePipelines); + view->BeginCulling(); } AuxGeomDrawPtr auxGeom; diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp index 16c2189a00..c02ac0713c 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/Scene.cpp @@ -500,7 +500,7 @@ namespace AZ } // Launch CullingSystem::ProcessCullables() jobs (will run concurrently with FeatureProcessor::Render() jobs) - m_cullingScene->BeginCulling(m_renderPacket.m_views, activePipelines); + m_cullingScene->BeginCulling(m_renderPacket.m_views); for (ViewPtr& viewPtr : m_renderPacket.m_views) { AZ::Job* processCullablesJob = AZ::CreateJobFunction([this, &viewPtr](AZ::Job& thisJob) diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp index 3060fc34a3..edae0f88b7 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/View.cpp @@ -54,7 +54,7 @@ namespace AZ } m_maskedOcclusionCulling = MaskedOcclusionCulling::Create(); - m_maskedOcclusionCulling->SetNearClipPlane(0.1f); + m_maskedOcclusionCulling->SetResolution(1920, 1080); } View::~View() @@ -388,56 +388,14 @@ namespace AZ m_needBuildSrg = false; } - void View::BeginCulling(const AZStd::vector& activePipelines) + void View::BeginCulling() { - // retrieve current resolution - Vector2 resolution(0.0f, 0.0f); - for (auto& pipeline : activePipelines) - { - ViewPtr pipelineView = pipeline->GetDefaultView(); - if (pipelineView.get() == this) - { - RPI::SwapChainPass* pass = AZ::RPI::PassSystemInterface::Get()->FindSwapChainPass(pipeline->GetWindowHandle()); - if (pass) - { - const RHI::Viewport& viewport = pass->GetViewport(); - resolution.SetX(viewport.m_maxX); - resolution.SetY(viewport.m_maxY); - } - break; - } - } - - // calculate culling resolution based on required tile size for MaskedOcclusionCulling - static const uint32_t MaskedOcclusionCullingSubTileWidth = 8; - static const uint32_t MaskedOcclusionCullingSubTileHeight = 4; - - uint32_t cullingWidth = RHI::AlignUp(resolution.GetX(), MaskedOcclusionCullingSubTileWidth); - uint32_t cullingHeight = RHI::AlignUp(resolution.GetY(), MaskedOcclusionCullingSubTileHeight); - - m_maskedOcclusionCulling->SetResolution(cullingWidth, cullingHeight); - - if (cullingWidth > 0 && cullingHeight > 0) - { - m_maskedOcclusionCulling->ClearBuffer(); - } + m_maskedOcclusionCulling->ClearBuffer(); } MaskedOcclusionCulling* View::GetMaskedOcclusionCulling() { - if (m_maskedOcclusionCulling) - { - uint32_t width = 0; - uint32_t height = 0; - - m_maskedOcclusionCulling->GetResolution(width, height); - if (width > 0 && height > 0) - { - return m_maskedOcclusionCulling; - } - } - - return nullptr; + return m_maskedOcclusionCulling; } } // namespace RPI