Giant_Beast_2025/Plugins/MetaXR/Source/OculusXRPassthrough/Private/OculusXRPassthroughXR_DeletionQueue.cpp

51 lines
1.7 KiB
C++

// @lint-ignore-every LICENSELINT
// Copyright Epic Games, Inc. All Rights Reserved.
#include "OculusXRPassthroughXR_DeletionQueue.h"
#include "XRThreadUtils.h"
#include "OculusXRHMDModule.h"
#include "OculusXRPassthroughXRFunctions.h"
#include "OculusXRPassthroughLayer.h"
namespace XRPassthrough
{
//-------------------------------------------------------------------------------------------------
// FDeferredDeletionQueue
//-------------------------------------------------------------------------------------------------
const uint32 NUM_FRAMES_TO_WAIT_FOR_OPENXR_LAYER_DELETE = 7;
void FDeferredDeletionQueue::AddOpenXRLayerToDeferredDeletionQueue(const XRPassthrough::FPassthroughLayerPtr& ptr)
{
DeferredDeletionEntry Entry;
Entry.OpenXRLayer = ptr;
Entry.FrameEnqueued = GFrameCounter;
Entry.EntryType = DeferredDeletionEntry::DeferredDeletionEntryType::OpenXRLayer;
DeferredDeletionArray.Add(Entry);
}
void FDeferredDeletionQueue::HandleLayerDeferredDeletionQueue_RenderThread(bool bDeleteImmediately)
{
// Traverse list backwards so the swap switches to elements already tested
for (int32 Index = DeferredDeletionArray.Num() - 1; Index >= 0; --Index)
{
DeferredDeletionEntry* Entry = &DeferredDeletionArray[Index];
if (Entry->EntryType == DeferredDeletionEntry::DeferredDeletionEntryType::OpenXRLayer)
{
if (bDeleteImmediately || GFrameCounter > Entry->FrameEnqueued + NUM_FRAMES_TO_WAIT_FOR_OPENXR_LAYER_DELETE)
{
Entry->OpenXRLayer->DestroyLayer_RenderThread();
#if UE_VERSION_OLDER_THAN(5, 5, 0)
DeferredDeletionArray.RemoveAtSwap(Index, 1, false);
#else
DeferredDeletionArray.RemoveAtSwap(Index, 1, EAllowShrinking::No);
#endif
}
}
}
}
} // namespace XRPassthrough