2021-08-20 10:27:07 -04:00
<?xml version='1.0' ?>
<BuildGraph xmlns= "http://www.epicgames.com/BuildGraph" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://www.epicgames.com/BuildGraph ../../../Build/Graph/Schema.xsd" >
<!-- Horde Options -->
<EnvVar Name= "UE_HORDE_JOBID" />
<Option Name= "Horde" Restrict= "true|false" DefaultValue= "false" Description= "Whether the build is running under Horde" />
<Option Name= "PreflightChange" DefaultValue= "" Description= "Preflight CL number if preflight, empty otherwise" />
<Option Name= "SetPreflightFlag" DefaultValue= "true" Description= "Whether to set the IsPreflight flag to true for preflights. Use with caution: this will cause things like build versions to be set to their non-preflight form." />
<Property Name= "IsPreflight" Value= "false" />
<Property Name= "IsPreflight" Value= "true" If= "'$(PreflightChange)' != '' And $(SetPreflightFlag)" />
<Property Name= "PreflightSuffix" Value= "" />
<Property Name= "PreflightSuffix" Value= "-PF-$(PreflightChange)-$(UE_HORDE_JOBID)" If= "$(IsPreflight)" />
<Property Name= "BuildName" Value= "$(EscapedBranch)-CL-$(Change)$(PreflightSuffix)" />
<!-- Projects setup -->
<Option Name= "Projects" DefaultValue= "false" Restrict= ".+" Description= "The projects to test" />
<Error Message= "No project names specified" If= "'$(Projects)' == 'false'" />
<!-- Platform Options -->
<Option Name= "Platforms" DefaultValue= "Win64" Description= "The list of platforms to profile" />
<Property Name= "Win64CompileAgentType" Value= "Win64" />
<Property Name= "MacCompileAgentType" Value= "TestMac" />
<Error Message= "No platforms specified" If= "'$(Platforms)' == ''" />
<!-- Build Options -->
<Property Name= "ExtraPluginsCommaDelims" Value= "EditorTests" />
<Property Name= "ExtraPluginsPlusDelims" Value= "" /> <!-- populated programmatically -->
<ForEach Name= "Plugin" Values= "$(ExtraPluginsCommaDelims)" >
<Property Name= "ExtraPluginString" Value= "$(Plugin)" If= "'$(ExtraPluginsPlusDelims)' == ''" />
<Property Name= "ExtraPluginString" Value= "$(ExtraPluginsPlusDelims)+$(Plugin)" If= "'$(ExtraPluginsPlusDelims)' != ''" />
<Property Name= "ExtraPluginsPlusDelims" Value= "$(ExtraPluginString)" />
</ForEach>
<Property Name= "EditorCompileArgs" Value= "-BuildPlugin=$(ExtraPluginsPlusDelims)" />
<!-- Automation uses its own network output directory -->
2021-08-20 15:28:36 -04:00
<Property Name= "AutomationNetworkRootDir" Value= "\\epicgames.net\root\Builds\Automation\Reports\EditorPerf" />
<Property Name= "AutomationNetworkRootDir" Value= "/Volumes/Builds/Automation/Reports/EditorPerf" If= "'$(HostPlatform)' != 'Win64'" />
2021-08-20 10:27:07 -04:00
<Property Name= "AutomationLocalOutputDir" Value= "$(RootDir)/LocalBuilds/Reports" />
<!-- Outputs for this run keeping slashes flipped the right way because it shows up on the webapp this way -->
<Property Name= "AutomationNetworkOutputDir" Value= "$(AutomationNetworkRootDir)\$(BuildName)" />
<Property Name= "AutomationNetworkOutputDir" Value= "$(AutomationNetworkRootDir)/$(BuildName)" If= "'$(HostPlatform)' != 'Win64'" />
<Property Name= "AutomationOutputDir" Value= "$(AutomationLocalOutputDir)" />
<Property Name= "AutomationOutputDir" Value= "$(AutomationNetworkOutputDir)" If= "$(IsBuildMachine)" />
<!-- Options for baselining -->
<Option Name= "RunAndBaseline" DefaultValue= "false" Description= "Enable graph dependencies for running and setting the baseline in a single build." />
<Option Name= "BaselineDir" DefaultValue= "$(RootDir)/Engine/Build/Baseline" Description= "The revision controlled location of the baseline telemetry files." />
<Option Name= "BaselineBuildName" DefaultValue= "$(BuildName)" Description= "The BuildName of the build to set as the new baseline to compare against." />
<Property Name= "BaselineAutomationNetworkOutputDir" Value= "$(AutomationNetworkRootDir)/$(BaselineBuildName)" />
<Property Name= "BaselineAutomationNetworkOutputDir" Value= "$(AutomationOutputDir)" If= "$(RunAndBaseline)" />
<!-- Arguments for tracing -->
<Option Name= "Phases" DefaultValue= "Incr;Warm;Cold" Description= "The list of phases to perform" />
<Error Message= "No phases specified" If= "'$(Phases)' == ''" />
<Property Name= "TraceDir" Value= "$(RootDir)/Engine/Programs/UnrealInsights/Saved/TraceSessions" />
<!-- Arguments for phases, keep in mind that these are passed to both the DDCCleanupCommandlet and RunUnreal -->
<Option Name= "ColdArgs" DefaultValue= "-ddc=Cold" Description= "Arguments to unreal for the cold phase" />
<Option Name= "IncrArgs" DefaultValue= "-ddc=Warm" Description= "Arguments to unreal for the incremental phase" />
<Option Name= "WarmArgs" DefaultValue= "-ddc=Warm" Description= "Arguments to unreal for the warm phase" />
<!-- Iterations to run and average together -->
2021-09-07 15:32:09 -04:00
<Option Name= "Iterations" DefaultValue= "1;2;3" Description= "The number of iterations to run" />
2021-08-20 10:27:07 -04:00
<!-- Gauntlet arguments for all runs -->
<Property Name= "GauntletArgs" Value= "-build=editor -UseEditor -verbose -tempdir="$(RootDir)/Tests"" />
<Property Name= "GauntletArgs" Value= "$(GauntletArgs) -branch=$(Branch) -ECBranch="$(Branch)" -ECChangelist="$(Change)"" />
<Property Name= "GauntletArgs" Value= "$(GauntletArgs) -maxduration=28800" />
<!-- Gauntlet arguments for profile runs -->
<Property Name= "ProfileArgs" Value= "-test=EditorTests -testfilter=Group:Iteration -tracefiletrunc" />
<Property Name= "ProfileArgs" Value= "$(ProfileArgs) -EnablePlugins=$(ExtraPluginsCommaDelims)" If= "'$(ExtraPluginsCommaDelims)' != ''" />
<Property Name= "ProfileArgs" Value= "$(ProfileArgs) -TreatLogWarningsAsTestErrors=false -TreatLogErrorsAsTestErrors=false" />
<Property Name= "ProfileArgs" Value= "$(ProfileArgs) -GameInstanceLostTimerSeconds=3600" />
<Property Name= "ProfileArgs" Value= "$(ProfileArgs) -NoLoadLevelAtStartup -Benchmarking -NODDCCLEANUP" />
<Property Name= "ProfileArgs" Value= "$(ProfileArgs) -NoShaderDistrib -VerboseShaderLogging" />
<!-- Gauntlet arguments for commandlet, summarize runs -->
<Property Name= "CommandletArgs" Value= "-notraceserver" />
<Property Name= "SummarizeArgs" Value= "" />
<Property Name= "SummarizeArgs" Value= "-skipbaseline" If= "$(RunAndBaseline)" />
<!-- The main test running macro logic that is expanded with platform and dependency node names -->
<Macro Name= "RunTest" Arguments= "OutputName;Platform;Project;NodeName;Phase;Args" >
2021-08-20 15:28:36 -04:00
<Property Name= "TestName" Value= "EditorPerf$(Phase)" />
2021-08-20 10:27:07 -04:00
<ForEach Name= "Iteration" Values= "$(Iterations)" >
<!-- Only ever do one iteration of incremental, because it will warm up the workspace -->
<Do If= "'$(Phase)' != 'Incr' or '$(Iteration)' == '1'" >
<Property Name= "IterationName" Value= "$(Project)$(Platform)$(TestName)$(Iteration)" />
<Property Name= "TraceFilePath" Value= "$(TraceDir)/$(IterationName).utrace" />
<Property Name= "TelemetryFileName" Value= "$(IterationName)Telemetry.csv" />
<Property Name= "TelemetryFilePath" Value= "$(TraceDir)/$(TelemetryFileName)" />
<Property Name= "LogOutputParams" Value= "-logdir="$(AutomationOutputDir)/$(OutputName)"" />
2021-08-23 10:50:24 -04:00
<Property Name= "ReportParams" Value= "-WriteTestResultsForHorde -HordeTestDataKey="$(NodeName) $(Phase)$(Iteration)$(PreflightSuffix)"" />
<Property Name= "AllGauntletArgs" Value= "-project=$(Project) -platform=$(Platform) $(GauntletArgs) $(ReportParams) $(LogOutputParams) -artifactname="$(Phase)$(Iteration)"" />
2021-08-20 10:27:07 -04:00
<!-- Do DDC cleanup outside the editor process, handles Cold cleanup without changing stats -->
<Commandlet Project= "$(Project)" Name= "DDCCleanup" Arguments= "$(Args) $(CommandletArgs)" />
2021-08-20 15:28:36 -04:00
<!-- Run the Gauntlet EditorPerf Tests -->
2021-08-20 10:27:07 -04:00
<Command Name= "RunUnreal" Arguments= "$(AllGauntletArgs) $(ProfileArgs) $(Args) -tracefile="$(TraceFilePath)"" />
<!-- Translate the utrace file into csv data -->
<Commandlet Project= "$(Project)" Name= "SummarizeTrace" Arguments= "-inputfile="$(TraceFilePath)" -testname="$(TestName)" $(SummarizeArgs) $(CommandletArgs)" />
<!-- Save all files named for this run in the trace directory -->
<Copy From= "$(TraceDir)/$(IterationName)*.*" To= "$(AutomationOutputDir)" />
<Do If= "$(IsBuildMachine)" >
<Do If= "!$(IsPreflight)" >
<!-- Publish telemetry to the db -->
<Command Name= "PublishUnrealAutomationTelemetry" Arguments= "-CSVFile="$(TelemetryFilePath)" -project=$(Project) -changelist=$(Change) -branch=$(Branch)" />
</Do>
</Do>
</Do>
</ForEach> <!-- Iterations -->
</Macro>
<!-- This will be set to the names of all nodes we want to execute based on specified platforms/options -->
<Property Name= "RunGraphNodes" Value= "" />
<!-- Mimic of the Runner that retrieves the stashed telemetry file and copies it to the depot location -->
<Macro Name= "BaselineResult" Arguments= "Platform;Project;Phase" >
2021-08-20 15:28:36 -04:00
<Property Name= "TestName" Value= "EditorPerf$(Phase)" />
2021-08-20 10:27:07 -04:00
<Property Name= "IterationName" Value= "$(Project)$(Platform)$(TestName)1" /> <!-- Note the 1! We use Iteration 1 for baselines for now -->
<Property Name= "TelemetryFileName" Value= "$(IterationName)Telemetry.csv" />
<Property Name= "LocalTelemetryFilePath" Value= "$(BaselineDir)/$(TelemetryFileName)" />
<Property Name= "NetworkTelemetryFilePath" Value= "$(BaselineAutomationNetworkOutputDir)/$(TelemetryFileName)" />
<Copy From= "$(NetworkTelemetryFilePath)" To= "$(LocalTelemetryFilePath)" Overwrite= "true" />
<Do If= "!$(IsBuildMachine)" >
<Spawn Exe= "p4" Arguments= "reconcile -ea $(LocalTelemetryFilePath)" />
</Do>
</Macro>
<!-- This will be set to the names of all nodes we want to execute based on specified platforms/options -->
<Property Name= "BaselineGraphNodes" Value= "" />
<!-- ForEach Platform to run, generate graph nodes -->
<ForEach Name= "Platform" Values= "$(Platforms)" >
<!-- Project - independent prereq compiles -->
<Agent Name= "Prerequisites Agent $(Platform)" Type= "$($(Platform)CompileAgentType)" >
<Node Name= "Compile Prerequisites $(Platform)" >
<Compile Target= "UnrealHeaderTool" Platform= "$(Platform)" Configuration= "Development" />
<Compile Target= "ShaderCompileWorker" Platform= "$(Platform)" Configuration= "Development" />
<Compile Target= "CrashReportClient" Platform= "$(Platform)" Configuration= "Shipping" />
<Compile Target= "CrashReportClientEditor" Platform= "$(Platform)" Configuration= "Shipping" />
</Node>
<!-- ForEach Project to run, generate the compile graph nodes -->
<ForEach Name= "Project" Values= "$(Projects)" >
<Node Name= "Compile $(Project) Editor $(Platform)" Requires= "Compile Prerequisites $(Platform)" >
<Compile Target= "$(Project)Editor" Platform= "$(Platform)" Configuration= "Development" Arguments= "$(EditorCompileArgs)" />
</Node>
</ForEach>
</Agent>
<!-- ForEach Project to run, generate the graph nodes -->
<ForEach Name= "Project" Values= "$(Projects)" >
<!-- Project execution -->
2021-08-20 16:43:14 -04:00
<Agent Name= "Automated Test Agent $(Project) $(Platform)" Type= "EditorPerf$(Platform)" >
2021-08-20 15:28:36 -04:00
<Property Name= "OutputName" Value= "$(Project)$(Platform)EditorPerf" />
2021-08-20 10:27:07 -04:00
<Property Name= "RunNodeName" Value= "Run $(OutputName)" />
<Property Name= "RunNodeRequires" Value= "Compile Prerequisites $(Platform);Compile $(Project) Editor $(Platform)" />
<Property Name= "BaselineNodeName" Value= "Baseline $(OutputName)" />
<Property Name= "BaselineNodeRequires" Value= "" />
<Property Name= "BaselineNodeRequires" Value= "$(RunNodeName)" If= "$(RunAndBaseline)" />
<!-- Run the Tests -->
<Node Name= "$(RunNodeName)" Requires= "$(RunNodeRequires)" >
<ForEach Name= "Phase" Values= "$(Phases)" >
<Expand Name= "RunTest" OutputName= "$(OutputName)" Platform= "$(Platform)" Project= "$(Project)" NodeName= "$(RunNodeName)" Phase= "$(Phase)" Args= "$($(Phase)Args)" />
</ForEach>
</Node>
<Property Name= "RunGraphNodes" Value= "$(RunGraphNodes);$(RunNodeName)" />
<!-- Baseline the Results -->
<Node Name= "$(BaselineNodeName)" Requires= "$(BaselineNodeRequires)" >
<ForEach Name= "Phase" Values= "$(Phases)" >
<Expand Name= "BaselineResult" Platform= "$(Platform)" Project= "$(Project)" Phase= "$(Phase)" />
</ForEach>
</Node>
<Property Name= "BaselineGraphNodes" Value= "$(BaselineGraphNodes);$(BaselineNodeName)" />
2021-08-20 15:28:36 -04:00
<Label Category= "Test" Name= "$(Project) EditorPerf $(Platform)" Requires= "$(RunNodeName)" />
2021-08-20 10:27:07 -04:00
</Agent>
</ForEach> <!-- Projects -->
</ForEach> <!-- Platforms -->
<!-- These Nodes run the Editor and gather profile data -->
2021-08-20 15:28:36 -04:00
<Aggregate Name= "Run EditorPerf Tests" Requires= "$(RunGraphNodes)" />
2021-08-20 10:27:07 -04:00
<!-- These Nodes copies the CSV telemetry files to special location in the depot, thus making them the "baselines" -->
2021-08-20 15:28:36 -04:00
<Aggregate Name= "Baseline EditorPerf Results" Requires= "$(BaselineGraphNodes)" />
2021-08-20 10:27:07 -04:00
<!-- This Node submits the baseline CSV files to Perforce -->
<!--
<Agent Name= "Submission Agent Win64" Type= "Win64" >
<Node Name= "Submit Baseline To Perforce" Requires= "$(BaselineGraphNodes)" >
2021-08-20 15:28:36 -04:00
<Submit Description= "[CL $(Change)] Updated EditorPerf baselines" Files= "$(BaselineFiles)" />
2021-08-20 10:27:07 -04:00
</Node>
</Agent>
-->
</BuildGraph>