51 lines
1.7 KiB
C++
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
|