2021-05-21 12:24:43 -04:00
|
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
|
|
|
|
|
|
#include "DerivedDataCacheModule.h"
|
|
|
|
|
|
2021-08-05 13:11:50 -04:00
|
|
|
#include "CoreGlobals.h"
|
2021-05-21 12:24:43 -04:00
|
|
|
#include "DerivedDataBuild.h"
|
|
|
|
|
#include "DerivedDataBuildPrivate.h"
|
|
|
|
|
#include "DerivedDataCache.h"
|
|
|
|
|
#include "DerivedDataCacheInterface.h"
|
|
|
|
|
#include "DerivedDataCachePrivate.h"
|
|
|
|
|
#include "Misc/ScopeLock.h"
|
|
|
|
|
#include "Modules/ModuleManager.h"
|
|
|
|
|
|
|
|
|
|
namespace UE::DerivedData::Private
|
|
|
|
|
{
|
|
|
|
|
|
2021-08-05 13:11:50 -04:00
|
|
|
static FDerivedDataCacheInterface* GDerivedDataLegacyCache;
|
|
|
|
|
static ICache* GDerivedDataCache;
|
|
|
|
|
static IBuild* GDerivedDataBuild;
|
2021-05-21 12:24:43 -04:00
|
|
|
|
|
|
|
|
PRAGMA_DISABLE_DEPRECATION_WARNINGS
|
|
|
|
|
|
|
|
|
|
class FDerivedDataCacheModule final : public IDerivedDataCacheModule
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
FDerivedDataCacheInterface& GetDDC() final
|
|
|
|
|
{
|
|
|
|
|
return **CreateOrGetCache();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
FDerivedDataCacheInterface* const* CreateOrGetCache() final
|
|
|
|
|
{
|
2021-08-05 13:11:50 -04:00
|
|
|
CreateCacheOnce();
|
|
|
|
|
check(GDerivedDataLegacyCache);
|
|
|
|
|
return &GDerivedDataLegacyCache;
|
2021-05-21 12:24:43 -04:00
|
|
|
}
|
|
|
|
|
|
2021-08-05 13:11:50 -04:00
|
|
|
void CreateCacheOnce()
|
2021-05-21 12:24:43 -04:00
|
|
|
{
|
|
|
|
|
FScopeLock Lock(&CreateLock);
|
2021-08-05 13:11:50 -04:00
|
|
|
if (!GDerivedDataCache)
|
2021-05-21 12:24:43 -04:00
|
|
|
{
|
2021-08-05 13:11:50 -04:00
|
|
|
GDerivedDataCache = CreateCache(&GDerivedDataLegacyCache);
|
|
|
|
|
check(GDerivedDataCache);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void CreateBuildOnce()
|
|
|
|
|
{
|
|
|
|
|
CreateCacheOnce();
|
|
|
|
|
FScopeLock Lock(&CreateLock);
|
|
|
|
|
if (!GDerivedDataBuild)
|
|
|
|
|
{
|
|
|
|
|
GDerivedDataBuild = CreateBuild(*GDerivedDataCache);
|
|
|
|
|
check(GDerivedDataBuild);
|
2021-05-21 12:24:43 -04:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ShutdownModule() final
|
|
|
|
|
{
|
2021-08-05 13:11:50 -04:00
|
|
|
delete GDerivedDataBuild;
|
|
|
|
|
GDerivedDataBuild = nullptr;
|
|
|
|
|
delete GDerivedDataCache;
|
|
|
|
|
GDerivedDataLegacyCache = nullptr;
|
|
|
|
|
GDerivedDataCache = nullptr;
|
2021-05-21 12:24:43 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
FCriticalSection CreateLock;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
PRAGMA_ENABLE_DEPRECATION_WARNINGS
|
|
|
|
|
|
2021-08-05 13:11:50 -04:00
|
|
|
static FDerivedDataCacheModule* GetModule()
|
|
|
|
|
{
|
|
|
|
|
if (!FPlatformProperties::RequiresCookedData())
|
|
|
|
|
{
|
|
|
|
|
check(IsInGameThread());
|
|
|
|
|
if (IDerivedDataCacheModule* Module = FModuleManager::LoadModulePtr<IDerivedDataCacheModule>("DerivedDataCache"))
|
|
|
|
|
{
|
|
|
|
|
return static_cast<FDerivedDataCacheModule*>(Module);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-21 12:24:43 -04:00
|
|
|
} // UE::DerivedData::Private
|
|
|
|
|
|
2021-08-05 13:11:50 -04:00
|
|
|
namespace UE::DerivedData
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
ICache& GetCache()
|
|
|
|
|
{
|
|
|
|
|
if (ICache* Cache = Private::GDerivedDataCache)
|
|
|
|
|
{
|
|
|
|
|
return *Cache;
|
|
|
|
|
}
|
|
|
|
|
if (Private::FDerivedDataCacheModule* Module = Private::GetModule())
|
|
|
|
|
{
|
|
|
|
|
Module->CreateCacheOnce();
|
|
|
|
|
}
|
|
|
|
|
ICache* Cache = Private::GDerivedDataCache;
|
|
|
|
|
check(Cache);
|
|
|
|
|
return *Cache;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
IBuild& GetBuild()
|
|
|
|
|
{
|
|
|
|
|
if (IBuild* Build = Private::GDerivedDataBuild)
|
|
|
|
|
{
|
|
|
|
|
return *Build;
|
|
|
|
|
}
|
|
|
|
|
if (Private::FDerivedDataCacheModule* Module = Private::GetModule())
|
|
|
|
|
{
|
|
|
|
|
Module->CreateBuildOnce();
|
|
|
|
|
}
|
|
|
|
|
IBuild* Build = Private::GDerivedDataBuild;
|
|
|
|
|
check(Build);
|
|
|
|
|
return *Build;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // UE::DerivedData
|
|
|
|
|
|
2021-05-21 12:24:43 -04:00
|
|
|
IMPLEMENT_MODULE(UE::DerivedData::Private::FDerivedDataCacheModule, DerivedDataCache);
|