October3d55/M/PICOXRPlugin/Source/PICOXRHMD/Private/PXR_DelayDeleteLayer.cpp

68 lines
2.4 KiB
C++

// Copyright PICO Technology Co., Ltd. All rights reserved.
// This plugin incorporates portions of the Unreal® Engine. Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere.
// Copyright Epic Games, Inc. All Rights Reserved.
#include "PXR_DelayDeleteLayer.h"
#include "XRThreadUtils.h"
#include "PXR_Log.h"
#include "PXR_HMDModule.h"
uint32 GPICOHMDLayerDeletionFrameNumber = 0;
const uint32 NUM_FRAMES_TO_WAIT_FOR_LAYER_DELETE = 3;
const uint32 NUM_FRAMES_TO_WAIT_FOR_PXR_LAYER_DELETE = 7;
void FDelayDeleteLayerManager::AddLayerToDeferredDeletionQueue(const FPICOLayerPtr& ptr)
{
DelayDeleteLayerEntry Entry;
Entry.Layer = ptr;
if (ptr.IsValid())
{
Entry.ID = ptr->GetID();
}
Entry.FrameEnqueued = GPICOHMDLayerDeletionFrameNumber;
Entry.EntryType = DelayDeleteLayerEntry::DelayDeleteLayerEntryType::Layer;
DeferredDeletionArray.Add(Entry);
}
void FDelayDeleteLayerManager::AddPxrLayerToDeferredDeletionQueue(const uint32 ID, const uint32 layerID)
{
DelayDeleteLayerEntry Entry;
Entry.ID = ID;
Entry.PxrLayerId = layerID;
Entry.FrameEnqueued = GPICOHMDLayerDeletionFrameNumber;
Entry.EntryType = DelayDeleteLayerEntry::DelayDeleteLayerEntryType::PxrLayer;
DeferredDeletionArray.Add(Entry);
}
void FDelayDeleteLayerManager::HandleLayerDeferredDeletionQueue_RenderThread(bool bDeleteImmediately)
{
for (int32 Index = DeferredDeletionArray.Num() - 1; Index >= 0; --Index)
{
DelayDeleteLayerEntry* Entry = &DeferredDeletionArray[Index];
if (Entry->EntryType == DelayDeleteLayerEntry::DelayDeleteLayerEntryType::Layer)
{
if (bDeleteImmediately || GPICOHMDLayerDeletionFrameNumber > Entry->FrameEnqueued + NUM_FRAMES_TO_WAIT_FOR_LAYER_DELETE)
{
PXR_LOGI(PxrUnreal, "Destroying UELayerID:%d", Entry->ID);
DeferredDeletionArray.RemoveAtSwap(Index, 1, EAllowShrinking::No);
}
}
else if (Entry->EntryType == DelayDeleteLayerEntry::DelayDeleteLayerEntryType::PxrLayer)
{
if (bDeleteImmediately || GPICOHMDLayerDeletionFrameNumber > Entry->FrameEnqueued + NUM_FRAMES_TO_WAIT_FOR_PXR_LAYER_DELETE)
{
ExecuteOnRHIThread_DoNotWait([ID = Entry->ID, PxrLayerId = Entry->PxrLayerId]()
{
PXR_LOGI(PxrUnreal, "Destroying ID:%d, PxrLayerID:%d", ID, PxrLayerId);
#if PLATFORM_ANDROID
FPICOXRHMDModule::GetPluginWrapper().DestroyLayer(PxrLayerId);
#endif
});
DeferredDeletionArray.RemoveAtSwap(Index, 1, EAllowShrinking::No);
}
}
}
++GPICOHMDLayerDeletionFrameNumber;
}