You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
Any function that may create a request now has a IRequestOwner& parameter, and uses the Begin and End functions on the owner to manage the lifetime of any requests that it creates, as well as using End to invoke the completion callback for any request which has one. The new FRequestBarrier may be used to block a group from being considered complete in a scope where more requests may be added to it. #rb Matt.Peters #rnx #preflight 6109b5c403d303000144cce5 #preflight 610acf7103d30300016fda94 #ROBOMERGE-SOURCE: CL 17060470 in //UE5/Main/... #ROBOMERGE-BOT: STARSHIP (Main -> Release-Engine-Test) (v850-17047176) [CL 17060649 by devin doucette in ue5-release-engine-test branch]
144 lines
4.0 KiB
C++
144 lines
4.0 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "DerivedDataBuildSession.h"
|
|
|
|
#include "Containers/UnrealString.h"
|
|
#include "DerivedDataBuildAction.h"
|
|
#include "DerivedDataBuildDefinition.h"
|
|
#include "DerivedDataBuildJob.h"
|
|
#include "DerivedDataBuildOutput.h"
|
|
#include "DerivedDataBuildPrivate.h"
|
|
|
|
namespace UE::DerivedData::Private
|
|
{
|
|
|
|
class FBuildSessionInternal final : public IBuildSessionInternal
|
|
{
|
|
public:
|
|
FBuildSessionInternal(
|
|
FStringView InName,
|
|
ICache& InCache,
|
|
IBuild& InBuildSystem,
|
|
IBuildScheduler& InScheduler,
|
|
IBuildInputResolver* InInputResolver)
|
|
: Name(InName)
|
|
, Cache(InCache)
|
|
, BuildSystem(InBuildSystem)
|
|
, Scheduler(InScheduler)
|
|
, InputResolver(InInputResolver)
|
|
{
|
|
}
|
|
|
|
FStringView GetName() const final { return Name; }
|
|
|
|
void Build(
|
|
const FBuildDefinition& Definition,
|
|
EBuildPolicy Policy,
|
|
IRequestOwner& Owner,
|
|
FOnBuildComplete&& OnComplete) final;
|
|
|
|
void BuildAction(
|
|
const FBuildAction& Action,
|
|
const FOptionalBuildInputs& Inputs,
|
|
EBuildPolicy Policy,
|
|
IRequestOwner& Owner,
|
|
FOnBuildActionComplete&& OnComplete) final;
|
|
|
|
void BuildPayload(
|
|
const FBuildPayloadKey& Payload,
|
|
EBuildPolicy Policy,
|
|
IRequestOwner& Owner,
|
|
FOnBuildPayloadComplete&& OnComplete) final;
|
|
|
|
FString Name;
|
|
ICache& Cache;
|
|
IBuild& BuildSystem;
|
|
IBuildScheduler& Scheduler;
|
|
IBuildInputResolver* InputResolver;
|
|
};
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void FBuildSessionInternal::Build(
|
|
const FBuildDefinition& Definition,
|
|
EBuildPolicy Policy,
|
|
IRequestOwner& Owner,
|
|
FOnBuildComplete&& OnComplete)
|
|
{
|
|
FOnBuildJobComplete OnJobComplete;
|
|
if (OnComplete)
|
|
{
|
|
OnJobComplete = [Definition, OnComplete = MoveTemp(OnComplete)](FBuildJobCompleteParams&& Params)
|
|
{
|
|
OnComplete({Definition.GetKey(), Params.CacheKey, MoveTemp(Params.Output), Params.BuildStatus, Params.Status});
|
|
};
|
|
}
|
|
CreateBuildJob({Cache, BuildSystem, Scheduler, InputResolver, Owner, Policy}, Definition, MoveTemp(OnJobComplete));
|
|
}
|
|
|
|
void FBuildSessionInternal::BuildAction(
|
|
const FBuildAction& Action,
|
|
const FOptionalBuildInputs& Inputs,
|
|
EBuildPolicy Policy,
|
|
IRequestOwner& Owner,
|
|
FOnBuildActionComplete&& OnComplete)
|
|
{
|
|
FOnBuildJobComplete OnJobComplete;
|
|
if (OnComplete)
|
|
{
|
|
OnJobComplete = [Action, OnComplete = MoveTemp(OnComplete)](FBuildJobCompleteParams&& Params)
|
|
{
|
|
OnComplete({Action.GetKey(), Params.CacheKey, MoveTemp(Params.Output), Params.BuildStatus, Params.Status});
|
|
};
|
|
}
|
|
CreateBuildJob({Cache, BuildSystem, Scheduler, InputResolver, Owner, Policy}, Action, Inputs, MoveTemp(OnJobComplete));
|
|
}
|
|
|
|
void FBuildSessionInternal::BuildPayload(
|
|
const FBuildPayloadKey& PayloadKey,
|
|
EBuildPolicy Policy,
|
|
IRequestOwner& Owner,
|
|
FOnBuildPayloadComplete&& OnComplete)
|
|
{
|
|
// This requests the entire output to get one payload. It will be optimized later to request only one payload.
|
|
FOnBuildJobComplete OnJobComplete;
|
|
if (OnComplete)
|
|
{
|
|
OnJobComplete = [PayloadKey, OnComplete = MoveTemp(OnComplete)](FBuildJobCompleteParams&& Params)
|
|
{
|
|
FPayload Payload;
|
|
EStatus Status = Params.Status;
|
|
if (Status == EStatus::Ok)
|
|
{
|
|
Payload = Params.Output.GetPayload(PayloadKey.Id);
|
|
Status = Payload ? EStatus::Ok : EStatus::Error;
|
|
}
|
|
if (!Payload)
|
|
{
|
|
Payload = FPayload(PayloadKey.Id);
|
|
}
|
|
OnComplete({PayloadKey.BuildKey, MoveTemp(Payload), Status});
|
|
};
|
|
}
|
|
CreateBuildJob({Cache, BuildSystem, Scheduler, InputResolver, Owner, Policy}, PayloadKey.BuildKey, MoveTemp(OnJobComplete));
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
FBuildSession CreateBuildSession(IBuildSessionInternal* Session)
|
|
{
|
|
return FBuildSession(Session);
|
|
}
|
|
|
|
FBuildSession CreateBuildSession(
|
|
FStringView Name,
|
|
ICache& Cache,
|
|
IBuild& BuildSystem,
|
|
IBuildScheduler& Scheduler,
|
|
IBuildInputResolver* InputResolver)
|
|
{
|
|
return CreateBuildSession(new FBuildSessionInternal(Name, Cache, BuildSystem, Scheduler, InputResolver));
|
|
}
|
|
|
|
} // UE::DerivedData::Private
|