diff --git a/Graphics/GraphicsEngineWebGPU/include/FenceWebGPUImpl.hpp b/Graphics/GraphicsEngineWebGPU/include/FenceWebGPUImpl.hpp index ceea0a564..02f9ca02c 100644 --- a/Graphics/GraphicsEngineWebGPU/include/FenceWebGPUImpl.hpp +++ b/Graphics/GraphicsEngineWebGPU/include/FenceWebGPUImpl.hpp @@ -57,14 +57,12 @@ class FenceWebGPUImpl final : public FenceBase /// Implementation of IFence::Wait() in WebGPU backend. void DILIGENT_CALL_TYPE Wait(Uint64 Value) override final; - void AppendSyncPoints(const std::vector>& SyncPoints, Uint64 EventOnComplete); - - void RequestedValue(Uint64 Value); + void AppendSyncPoints(std::vector> SyncPoints, Uint64 Value); private: - using SyncPointEvent = std::pair>>; + using SyncPointGroup = std::pair>>; std::atomic m_RequestedFenceValue{0}; - std::deque m_SyncPoints; + std::deque m_SyncGroups; }; } // namespace Diligent diff --git a/Graphics/GraphicsEngineWebGPU/src/DeviceContextWebGPUImpl.cpp b/Graphics/GraphicsEngineWebGPU/src/DeviceContextWebGPUImpl.cpp index 5aa63aff5..3351a26ac 100644 --- a/Graphics/GraphicsEngineWebGPU/src/DeviceContextWebGPUImpl.cpp +++ b/Graphics/GraphicsEngineWebGPU/src/DeviceContextWebGPUImpl.cpp @@ -1405,13 +1405,6 @@ void DeviceContextWebGPUImpl::Flush() { DeviceContextWebGPUImpl* pDeviceCxt = static_cast(pUserData); - for (auto& [Signal, Fence] : pDeviceCxt->m_SignalFences) - { - auto* pFenceWebGPU = Fence.RawPtr(); - pFenceWebGPU->RequestedValue(Signal); - } - pDeviceCxt->m_SignalFences.clear(); - for (auto& MemPage : pDeviceCxt->m_DynamicMemPages) MemPage.Recycle(); pDeviceCxt->m_DynamicMemPages.clear(); @@ -1428,9 +1421,10 @@ void DeviceContextWebGPUImpl::Flush() for (const auto& [Signal, Fence] : m_SignalFences) { - auto* pFenceWebGPU = Fence.RawPtr(); - pFenceWebGPU->AppendSyncPoints(SyncPoints, Signal); + FenceWebGPUImpl* pFenceWebGPU = Fence.RawPtr(); + pFenceWebGPU->AppendSyncPoints(std::move(SyncPoints), Signal); } + m_SignalFences.clear(); GetQueryManager().ResolveQuerySet(m_pDevice, GetCommandEncoder()); diff --git a/Graphics/GraphicsEngineWebGPU/src/FenceWebGPUImpl.cpp b/Graphics/GraphicsEngineWebGPU/src/FenceWebGPUImpl.cpp index d55ccf968..529674691 100644 --- a/Graphics/GraphicsEngineWebGPU/src/FenceWebGPUImpl.cpp +++ b/Graphics/GraphicsEngineWebGPU/src/FenceWebGPUImpl.cpp @@ -44,30 +44,32 @@ FenceWebGPUImpl::FenceWebGPUImpl(IReferenceCounters* pRefCounters, Uint64 FenceWebGPUImpl::GetCompletedValue() { - if (!m_SyncPoints.empty()) + while (!m_SyncGroups.empty()) { - auto IsSyncPointCompleted = [](const std::vector>& SyncPoints) { - for (const auto& pSyncPoint : SyncPoints) - if (!pSyncPoint->IsTriggered()) - return false; - return true; - }; - - while (!m_SyncPoints.empty()) + SyncPointGroup& SyncGroup = m_SyncGroups.front(); + auto& SyncPoints = SyncGroup.second; + while (!SyncPoints.empty()) { - const auto& SyncPoint = m_SyncPoints.front(); - if (IsSyncPointCompleted(SyncPoint.second)) + if (SyncPoints.front()->IsTriggered()) { - UpdateLastCompletedFenceValue(SyncPoint.first); - m_SyncPoints.pop_front(); + std::swap(SyncPoints.front(), SyncPoints.back()); + SyncPoints.pop_back(); } else { - return m_LastCompletedFenceValue.load(); + break; } } - UpdateLastCompletedFenceValue(m_RequestedFenceValue.load()); + if (SyncPoints.empty()) + { + UpdateLastCompletedFenceValue(SyncGroup.first); + m_SyncGroups.pop_front(); + } + else + { + break; + } } return m_LastCompletedFenceValue.load(); @@ -84,18 +86,9 @@ void FenceWebGPUImpl::Wait(Uint64 Value) m_pDevice->DeviceTick(); } -void FenceWebGPUImpl::AppendSyncPoints(const std::vector>& SyncPoints, Uint64 EventOnComplete) -{ - m_SyncPoints.emplace_back(std::make_pair(EventOnComplete, SyncPoints)); -} - -void FenceWebGPUImpl::RequestedValue(Uint64 Value) +void FenceWebGPUImpl::AppendSyncPoints(std::vector> SyncPoints, Uint64 Value) { - DvpSignal(Value); - if (!m_SyncPoints.empty()) - m_RequestedFenceValue.store(Value); - else - UpdateLastCompletedFenceValue(Value); + m_SyncGroups.emplace_back(std::make_pair(Value, std::move(SyncPoints))); } } // namespace Diligent