Files
UnrealEngineUWP/Engine/Build/EditorPerf.xml
han chu a8ff74123a Build graph and performance metrics
A new commandlet was added to record the performance data of workflows tests.

Modified the build graph script for the EditorPerf test to include the task nodes and agents for the workflows tests.

#jira UE-189274
#review @Francis.Hurteau @logan.buchy

[CL 26532108 by han chu in ue5-main branch]
2023-07-21 21:34:35 -04:00

441 lines
29 KiB
XML

<?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)"/>
<Option Name="CompileCategory" DefaultValue="Editors" Description="Category string for Compile Label"/>
<Option Name="RunCategory" DefaultValue="Test" Description="Category string for Run Label"/>
<Option Name="BaselineCategory" DefaultValue="Test" Description="Category string for Baseline Label"/>
<Option Name="SingleAgentCompile" Restrict="true|false" DefaultValue="false" Description="Run all compile steps on same agent"/>
<!-- 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="Win64Compile;Win64"/>
<Property Name="MacCompileAgentType" Value="TestMac"/>
<Property Name="LinuxCompileAgentType" Value="Linux"/>
<Error Message="No platforms specified" If="'$(Platforms)' == ''"/>
<!-- Build Options -->
<Option Name="NoDebugInfo" Restrict="true|false" DefaultValue="false" Description="Compile without including debug info"/>
<Option Name="WithTSAN" Restrict="true|false" DefaultValue="false" Description="Compile using TSAN"/>
<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=""/>
<Property Name="EditorCompileArgs" Value="-BuildPlugin=$(ExtraPluginsPlusDelims)" If="'$(ExtraPluginsPlusDelims)' != ''"/>
<Property Name="EditorCompileArgs" Value="$(EditorCompileArgs) -nodebuginfo" If="$(NoDebugInfo)"/>
<Property Name="EditorCompileArgs" Value="$(EditorCompileArgs) -EnableTSAN -Monolithic" If="$(WithTSAN)"/>
<!-- Automation uses its own network output directory -->
<Property Name="AutomationNetworkRootDir" Value="\\epicgames.net\root\Builds\Automation\Reports\EditorPerf"/>
<Property Name="AutomationNetworkRootDir" Value="/Volumes/Builds/Automation/Reports/EditorPerf" If="'$(HostPlatform)' != 'Win64'"/>
<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="EnableBasePhaseTests" DefaultValue="true" Description="Enable the base phase perf tests."/>
<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 -->
<Option Name="Iterations" DefaultValue="1" Description="The list of iteration numbers to run. For example '1;2;3' for three iterations"/>
<!-- Full Map Asset Path to run for tests per project -->
<Option Name="MapAssetPerProjects" DefaultValue="" Description="Comma separated pair of project and map asset to load for it (i.e. 'FortniteGame,/Game/MyMap'), each pair are semicolon separated "/>
<!-- Full Map Asset Path to run for tests per project -->
<Option Name="SpecificArgsPerProjects" DefaultValue="" Description="Hat (^) separated pair of project and commandline arg for it (i.e. 'Juno^-TargetFortReleaseVersion=26.00'), each pair are semicolon separated "/>
<!-- Inject internal projects default argument at the global scope -->
<Option Name="IsLicensee" Restrict="true|false" DefaultValue="false" Description="Define to true if this script is used externally."/>
<Include Script="../Restricted/NotForLicensees/Build/EditorPerfInternalArgs.xml" If="!$(IsLicensee)" />
<!-- Set Project Map Args based on MapAssetPerProjects list -->
<ForEach Name="ProjectPair" Values="$(MapAssetPerProjects)" Separator=";">
<!-- Split the Pair -->
<Property Name="Project" Value=""/>
<Property Name="MapAsset" Value=""/>
<Regex Pattern="(.*),(.*)" Capture="Project;MapAsset" Input="$(ProjectPair)" />
<Property Name="$(Project)MapArgs" Value="-ini:Engine:[/Script/Engine.AutomationTestSettings]:MapsToPIETest=\&quot;$(MapAsset)\&quot;" If="'$(MapAsset)' != ''" />
</ForEach>
<!-- Options for extra runtime args -->
<Option Name="AdditionalRuntimeArgs" DefaultValue="" Description="Additional Arguments to pass to RunTest"/>
<!-- Set Project Specific Args based on SpecificArgsPerProjects list -->
<ForEach Name="ProjectPair" Values="$(SpecificArgsPerProjects)" Separator=";">
<!-- Split the Pair -->
<Property Name="Project" Value=""/>
<Property Name="SpecificArgs" Value=""/>
<Regex Pattern="(.*)^(.*)" Capture="Project;SpecificArgs" Input="$(ProjectPair)" />
<Property Name="$(Project)SpecificArgs" Value="$(SpecificArgs)" If="'$(SpecificArgs)' != ''" />
</ForEach>
<!-- Options for extra Zen Loader tests -->
<Option Name="EnableZenLoaderTest" DefaultValue="true" Description="Enable additional test per phase that uses the Zen Loader."/>
<Option Name="EnableZenAsyncThreadTest" DefaultValue="true" Description="Enable additional test per phase that uses the Zen Loader."/>
<Option Name="EnableZenTestsWithoutEditorDomain" DefaultValue="true" Description="Enable additional test per phase that uses the Zen Loader."/>
<!-- Zen Loader tests specifc arguments -->
<Property Name="ZenLoaderTestArgs" Value="-zenloader"/>
<Property Name="ZenLoaderAsyncTestArgs" Value="$(ZenLoaderTestArgs) -asyncloadingthread" />
<Property Name="ZenLoaderTestArgs" Value="$(ZenLoaderTestArgs) -noeditordomain" If="$(EnableZenTestsWithoutEditorDomain)" />
<Property Name="ZenLoaderAsyncTestArgs" Value="$(ZenLoaderAsyncTestArgs) -noeditordomain" If="$(EnableZenTestsWithoutEditorDomain)" />
<!-- Options for extra Zen Store tests -->
<Option Name="EnableZenStoreDDCTest" DefaultValue="false" Description="Enable additional test on warm phase that uses the Zen Store DDC."/>
<!-- Zen Store tests specific arguments -->
<Property Name="ZenServerCache" Value="$(RootDir)\ZenCache" />
<Property Name="ZenStoreCommonArgs" Value="-ini:Engine:[Zen.AutoLaunch]:LimitProcessLifetime=true -ZenDataPath=$(ZenServerCache) "/>
<Property Name="ZenStoreDDCPhaseArgs" Value="-ddc=ZenDDC"/>
<Property Name="ZenStoreDDCTestArgs" Value="$(ZenStoreCommonArgs)"/>
<!-- Options for extra LazyLoad tests -->
<Option Name="EnableLazyLoadTest" DefaultValue="false" Description="Enable additional test on warm phase that uses LazyLoad."/>
<Option Name="EnableLazyLoadZenTest" DefaultValue="false" Description="Enable additional test on warm phase that uses LazyLoad with Zen Loader."/>
<!-- LazyLoad tests specific arguments -->
<Property Name="LazyLoadTestArgs" Value="-LazyLoadImports"/>
<Property Name="LazyLoadZenTestArgs" Value="$(LazyLoadTestArgs) -zenloader" />
<!-- Gauntlet arguments for all runs -->
<Property Name="GauntletArgs" Value="-build=editor -UseEditor -verbose -tempdir=&quot;$(RootDir)/Tests&quot;"/>
<Property Name="GauntletArgs" Value="$(GauntletArgs) -branch=$(Branch) -ECBranch=&quot;$(Branch)&quot; -ECChangelist=&quot;$(Change)&quot;"/>
<Property Name="GauntletArgs" Value="$(GauntletArgs) -maxduration=28800"/>
<!-- Gauntlet arguments for profile runs -->
<Property Name="ProfileArgs" Value="-test=EditorTests -tracefiletrunc"/>
<Property Name="ProfileArgs" Value="$(ProfileArgs) -EnablePlugins=$(ExtraPluginsCommaDelims)" If="'$(ExtraPluginsCommaDelims)' != ''"/>
<Property Name="ProfileArgs" Value="$(ProfileArgs) -SuppressLogWarnings -SuppressLogErrors"/>
<Property Name="ProfileArgs" Value="$(ProfileArgs) -GameInstanceLostTimerSeconds=3600"/>
<Property Name="ProfileArgs" Value="$(ProfileArgs) -NoLoadLevelAtStartup -Benchmarking -NODDCCLEANUP"/>
<Property Name="ProfileArgs" Value="$(ProfileArgs) -NoShaderDistrib -VerboseShaderLogging"/>
<!-- options for summarize runs -->
<Option Name="RunTraceSummary" DefaultValue="false" Description="Summarize the insights trace after the run"/>
<!-- Gauntlet arguments for commandlet, summarize runs -->
<Property Name="CommandletArgs" Value="-notraceserver"/>
<Property Name="SummarizeArgs" Value=""/>
<Property Name="SummarizeArgs" Value="-skipbaseline" If="$(RunAndBaseline)"/>
<!-- Publish telemetry options -->
<Option Name="TelemetryConfig" DefaultValue="" Description="The configuration to use when publishing telemetry data to a database"/>
<Property Name="TelemetryConfig" Value="UETelemetryStaging" If="$(IsBuildMachine) And $(IsPreflight) And '$(TelemetryConfig)' == '' And $(RunTraceSummary)"/>
<Property Name="TelemetryConfig" Value="UETelemetry" If="$(IsBuildMachine) And '$(TelemetryConfig)' == '' And $(RunTraceSummary)"/>
<!-- The main test running macro logic that is expanded with platform and dependency node names -->
<Macro Name="RunTest" Arguments="TestNameSuffix;Platform;ProjectName;ProjectTarget;NodeName;Phase;Iteration;Args;EditorArgs">
<Property Name="TestName" Value="EditorPerf$(Phase)$(TestNameSuffix)"/>
<Property Name="TestFilter" Value="Project.Iteration.PIE"/>
<Property Name="TestFilterArgs" Value="-testfilter=$(TestFilter)"/>
<Property Name="IterationSuffix" Value=""/>
<Property Name="IterationSuffix" Value="$(Iteration)" If="'$(Iteration)' != '1'"/>
<Property Name="TestOutputDir" Value="$(AutomationOutputDir)/$(ProjectName)$(Platform)EditorPerf"/>
<Property Name="IterationName" Value="$(ProjectName)$(Platform)$(TestName)$(IterationSuffix)"/>
<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=&quot;$(TestOutputDir)&quot;"/>
<Property Name="ReportParams" Value="-WriteTestResultsForHorde -HordeTestDataKey=&quot;$(NodeName)$(PreflightSuffix)&quot;"/>
<Property Name="ArtifactName" Value="$(Phase)$(IterationSuffix)$(TestNameSuffix)"/>
<Property Name="AllGauntletArgs" Value="-Project=$(ProjectTarget) -Platform=$(Platform) $(GauntletArgs) $(ReportParams) $(LogOutputParams) -artifactname=&quot;$(ArtifactName)&quot;"/>
<Property Name="RunArgs" Value="$(Args) -editorargs=&quot;$(EditorArgs)&quot;"/>
<!-- Do DDC cleanup outside the editor process, handles Cold cleanup without changing stats -->
<!-- <Commandlet Project="$(ProjectTarget)" Name="DDCCleanup" Arguments="$(Args) $(CommandletArgs)"/> -->
<!-- Run the Gauntlet EditorPerf Tests -->
<Command Name="RunUnreal" Arguments="$(AllGauntletArgs) $(ProfileArgs) $(TestFilterArgs) $(RunArgs) -sessionlabel=&quot;$(TestName)&quot; -tracefile=&quot;$(TraceFilePath)&quot;"/>
<!-- Translate the utrace file into csv data -->
<Do If="$(RunTraceSummary)">
<Commandlet Project="$(ProjectTarget)" Name="SummarizeTrace" Arguments="-inputfile=&quot;$(TraceFilePath)&quot; -testname=&quot;$(TestName)&quot; $(SummarizeArgs) $(CommandletArgs)"/>
</Do>
<Do If="'$(TelemetryConfig)' != ''">
<!-- Publish telemetry to the db -->
<Command Name="PublishUnrealAutomationTelemetry" Arguments="-CSVFile=&quot;$(TelemetryFilePath)&quot; -project=$(Project) -changelist=$(Change) -branch=$(Branch) -TelemetryConfig=$(TelemetryConfig)"/>
</Do>
</Macro>
<!-- The main editor workflows test running macro logic that is expanded with platform and dependency node names -->
<Macro Name="RunEditorWorkflowsTest" Arguments="Platform;ProjectName;NodeName">
<Property Name="TestName" Value="Editor.Workflows"/>
<Property Name="TestFilter" Value="Editor.Workflows"/>
<Property Name="TestFilterArgs" Value="-testfilter=$(TestFilter)"/>
<Property Name="TestOutputDir" Value="$(AutomationOutputDir)/$(ProjectName)$(Platform)EditorWorkflows"/>
<Property Name="LogOutputParams" Value="-logdir=&quot;$(TestOutputDir)&quot;"/>
<Property Name="ReportParams" Value="-WriteTestResultsForHorde -HordeTestDataKey=&quot;$(NodeName)$(PreflightSuffix)&quot;"/>
<Property Name="AllGauntletArgs" Value="-Project=$(ProjectName) -Platform=$(Platform) $(GauntletArgs) $(ReportParams) $(LogOutputParams)"/>
<Property Name="TraceFilePath" Value="$(TraceDir)/Editor.Workflows/$(ProjectName)$(Platform)EditorWorkflows.utrace" />
<Command Name="RunUnreal" Arguments="$(AllGauntletArgs) $(ProfileArgs) $(TestFilterArgs) -sessionlabel=&quot;$(TestName)&quot; -tracefile=&quot;$(TraceFilePath)&quot;" />
<!-- Translate the utrace file into csv data -->
<Commandlet Project="$(ProjectName)" Name="SummarizeTraceEditorWorkflows" Arguments="-inputfile=&quot;$(TraceFilePath)&quot; -testname=&quot;$(TestName)&quot; $(CommandletArgs)" />
</Macro>
<Macro Name="UploadTestTraces" Arguments="Platform;ProjectName">
<!-- Save all files named for this project in the trace directory -->
<Property Name="TestOutputDir" Value="$(AutomationOutputDir)/$(ProjectName)$(Platform)EditorPerf"/>
<Copy From="$(TraceDir)/$(ProjectName)$(Platform)EditorPerf*.*" To="$(TestOutputDir)"/>
</Macro>
<Macro Name="UploadEditorWorkflowsPerformanceDataAndTraces" Arguments="Platform;ProjectName">
<!-- Copy the utrace file and the generated csv performance data to the output directory -->
<Property Name="TestOutputDir" Value="$(AutomationOutputDir)/$(ProjectName)$(Platform)EditorWorkflows"/>
<Copy From="$(TraceDir)/Editor.Workflows/*" To="$(TestOutputDir)/Editor.Workflows"/>
</Macro>
<!-- These will be set to the names of all nodes we want to execute based on specified platforms/options -->
<Property Name="RunGraphNodes" Value=""/>
<Property Name="RunEditorWorkflowsGraphNodes" 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">
<Property Name="TestName" Value="EditorPerf$(Phase)"/>
<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)">
<!-- ForEach Project to run, generate the graph nodes -->
<ForEach Name="Project" Values="$(Projects)">
<!-- We parse the Editor target name from within [] in case it's not $(Project)Editor -->
<Property Name="EditorTarget" Value="$(Project)Editor"/>
<Regex Pattern="(.*)\[(.*)\]" Capture="Project;EditorTarget" Input="$(Project)" Optional="true"/>
<!-- We parse the Project target name from within {} in case it's not $(Project) (i.e. Fortnite plugins projects: Juno, DelMar ) -->
<Property Name="ProjectTarget" Value="$(Project)"/>
<Regex Pattern="(.*)\{(.*)\}" Capture="Project;ProjectTarget" Input="$(Project)" Optional="true"/>
<!-- Project Map Args-->
<Property Name="ProjectCombinedArgs" Value="$($(Project)SpecificArgs) $($(Project)MapArgs) $(AdditionalRuntimeArgs)"/>
<!-- Use as base string for directories and key for node names -->
<Property Name="OutputName" Value="$(Project)$(Platform)EditorPerf"/>
<!-- Compile the Editor -->
<Property Name="CompileNodeName" Value="Compile $(Project) $(Platform)"/>
<Property Name="AgentModifier" Value=""/>
<Property Name="AgentModifier" Value=" $(Project)" If="!$(SingleAgentCompile)"/>
<Agent Name="Compile Editor Agent $(Platform)$(AgentModifier" Type="$($(Platform)CompileAgentType)">
<Node Name="$(CompileNodeName)">
<SetVersion Change="$(Change)" Branch="$(EscapedBranch)" If="$(IsBuildMachine)"/>
<Compile Target="ShaderCompileWorker" Platform="$(Platform)" Configuration="Development"/>
<Compile Target="CrashReportClientEditor" Platform="$(Platform)" Project="$(ProjectTarget)" Configuration="Shipping"/>
<Compile Target="$(EditorTarget)" Platform="$(Platform)" Project="$(ProjectTarget)" Configuration="Development" Arguments="$(EditorCompileArgs)"/>
</Node>
</Agent>
<Label Category="$(CompileCategory)" Name="$(Project) Editor Compile" Requires="$(CompileNodeName)"/>
<!-- Run the Tests -->
<Property Name="RunNodeRequires" Value="$(CompileNodeName)"/>
<Property Name="RunNodeList" Value=""/> <!-- Each node in this the nested loops below, they need to depend on predecessors -->
<Property Name="UploadNodeList" Value=""/>
<Agent Name="EditorPerf Agent $(Platform) $(Project)" Type="EditorPerf$(Platform)">
<ForEach Name="Phase" Values="$(Phases)">
<Do If="$(EnableBasePhaseTests)">
<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="IterationSuffix" Value=""/>
<Property Name="IterationSuffix" Value="$(Iteration)" If="'$(Iteration)' != '1'"/>
<Property Name="RunNodeName" Value="Run $(OutputName) $(Phase)$(IterationSuffix)"/>
<Node Name="$(RunNodeName)" Requires="$(RunNodeRequires);$(RunNodeList)">
<Expand Name="RunTest" TestNameSuffix="" Platform="$(Platform)" ProjectName="$(Project)" ProjectTarget="$(ProjectTarget)" NodeName="$(RunNodeName)" Phase="$(Phase)" Iteration="$(Iteration)" Args="$($(Phase)Args)" EditorArgs="$(ProjectCombinedArgs)"/>
</Node>
<Property Name="RunNodeList" Value="$(RunNodeList);$(RunNodeName)"/>
</Do>
</ForEach>
</Do>
<!-- Don't run Zen tests on incremental runs -->
<Do If="'$(Phase)' != 'Incr'">
<!-- Zen Loader TestRun if enabled -->
<Property Name="RunNodeZenName" Value="Run $(OutputName) $(Phase) Zen"/>
<Node Name="$(RunNodeZenName)" Requires="$(RunNodeRequires);$(RunNodeList)" If="$(EnableZenLoaderTest)">
<Expand Name="RunTest" TestNameSuffix="Zen" Platform="$(Platform)" ProjectName="$(Project)" ProjectTarget="$(ProjectTarget)" NodeName="$(RunNodeZenName)" Phase="$(Phase)" Iteration="1" Args="$($(Phase)Args)" EditorArgs="$(ProjectCombinedArgs) $(ZenLoaderTestArgs)"/>
</Node>
<Property Name="RunNodeList" Value="$(RunNodeList);$(RunNodeZenName)" If="$(EnableZenLoaderTest)"/>
<!-- Zen Loader Async TestRun if enabled -->
<Property Name="RunNodeZenAsyncName" Value="Run $(OutputName) $(Phase) Zen Async"/>
<Node Name="$(RunNodeZenAsyncName)" Requires="$(RunNodeRequires);$(RunNodeList)" If="$(EnableZenAsyncThreadTest)">
<Expand Name="RunTest" TestNameSuffix="ZenAsync" Platform="$(Platform)" ProjectName="$(Project)" ProjectTarget="$(ProjectTarget)" NodeName="$(RunNodeZenAsyncName)" Phase="$(Phase)" Iteration="1" Args="$($(Phase)Args)" EditorArgs="$(ProjectCombinedArgs) $(ZenLoaderAsyncTestArgs)"/>
</Node>
<Property Name="RunNodeList" Value="$(RunNodeList);$(RunNodeZenAsyncName)" If="$(EnableZenAsyncThreadTest)"/>
<!-- Zen Store DDC TestRun if enabled -->
<Property Name="RunNodeZenStoreDDCName" Value="Run $(OutputName) $(Phase) Zen Store DDC"/>
<Node Name="$(RunNodeZenStoreDDCName)" Requires="$(RunNodeRequires);$(RunNodeList)" If="$(EnableZenStoreDDCTest)">
<Expand Name="RunTest" TestNameSuffix="ZenAsync" Platform="$(Platform)" ProjectName="$(Project)" ProjectTarget="$(ProjectTarget)" NodeName="$(RunNodeZenStoreDDCName)" Phase="$(Phase)" Iteration="1" Args="$(ZenStoreDDCPhaseArgs)" EditorArgs="$(ProjectCombinedArgs) $(ZenStoreDDCTestArgs)"/>
</Node>
<Property Name="RunNodeList" Value="$(RunNodeList);$(RunNodeZenStoreDDCName)" If="$(EnableZenStoreDDCTest)"/>
</Do>
<!-- Warm only test runs e.g LazyLoad -->
<Do If="'$(Phase)' == 'Warm'">
<!-- Legacy LazyLoad TestRun if enabled -->
<Property Name="RunNodeLazyLoadName" Value="Run $(OutputName) $(Phase) LazyLoad"/>
<Node Name="$(RunNodeLazyLoadName)" Requires="$(RunNodeRequires);$(RunNodeList)" If="$(EnableLazyLoadTest)">
<Expand Name="RunTest" TestNameSuffix="Zen" Platform="$(Platform)" ProjectName="$(Project)" ProjectTarget="$(ProjectTarget)" NodeName="$(RunNodeLazyLoadName)" Phase="$(Phase)" Iteration="1" Args="$($(Phase)Args)" EditorArgs="$(ProjectCombinedArgs) $(LazyLoadTestArgs)"/>
</Node>
<Property Name="RunNodeList" Value="$(RunNodeList);$(RunNodeLazyLoadName)" If="$(EnableLazyLoadTest)"/>
<!-- Zen LazyLoad TestRun if enabled -->
<Property Name="RunNodeLazyLoadZenName" Value="Run $(OutputName) $(Phase) LazyLoad Zen"/>
<Node Name="$(RunNodeLazyLoadZenName)" Requires="$(RunNodeRequires);$(RunNodeList)" If="$(EnableLazyLoadZenTest)">
<Expand Name="RunTest" TestNameSuffix="Zen" Platform="$(Platform)" ProjectName="$(Project)" ProjectTarget="$(ProjectTarget)" NodeName="$(RunNodeLazyLoadZenName)" Phase="$(Phase)" Iteration="1" Args="$($(Phase)Args)" EditorArgs="$(ProjectCombinedArgs) $(LazyLoadZenTestArgs)"/>
</Node>
<Property Name="RunNodeList" Value="$(RunNodeList);$(RunNodeLazyLoadZenName)" If="$(EnableLazyLoadZenTest)"/>
</Do>
</ForEach>
<Property Name="RunNodeUploadPhaseTraces" Value="Upload $(OutputName) Traces"/>
<Node Name="$(RunNodeUploadPhaseTraces)">
<Expand Name="UploadTestTraces" Platform="$(Platform)" ProjectName="$(Project)"/>
</Node>
<Property Name="UploadNodeList" Value="$(RunNodeUploadPhaseTraces)"/>
</Agent>
<Label Category="$(RunCategory)" Name="$(Project) Editor Run" Requires="$(RunNodeRequires);$(RunNodeList);$(UploadNodeList)" UgsBadge="$(Project) Editor Run"/>
<Property Name="RunGraphNodes" Value="$(RunGraphNodes);$(RunNodeList);$(UploadNodeList)"/>
<!-- Baseline the Results -->
<Property Name="BaselineNodeName" Value="Baseline $(OutputName)"/>
<Property Name="BaselineNodeRequires" Value=""/>
<Property Name="BaselineNodeRequires" Value="$(RunNodeName)" If="$(RunAndBaseline)"/>
<Property Name="BaselineGraphNodes" Value="$(BaselineGraphNodes);$(BaselineNodeName)"/>
<Agent Name="EditorPerf Agent $(Platform) $(Project)" Type="EditorPerf$(Platform)">
<Node Name="$(BaselineNodeName)" Requires="$(BaselineNodeRequires)">
<ForEach Name="Phase" Values="$(Phases)">
<Expand Name="BaselineResult" Platform="$(Platform)" Project="$(Project)" Phase="$(Phase)"/>
</ForEach>
</Node>
</Agent>
<Label Category="$(BaselineCategory)" Name="$(Project) Perf Baseline" Requires="$(BaselineNodeName)"/>
</ForEach> <!-- Projects -->
</ForEach> <!-- Platforms -->
<!-- Generate graph nodes for each platform to run -->
<ForEach Name="Platform" Values="$(Platforms)">
<!-- Define output name for the EditorWorkflows test -->
<Property Name="EditorWorkflowsOutputName" Value="EngineTest$(Platform)EditorWorkflows"/>
<Property Name="CompileNodeName" Value="Compile EngineTest $(Platform) EditorWorkflows"/>
<Property Name="AgentModifier" Value=""/>
<Property Name="AgentModifier" Value=" EngineTest" If="!$(SingleAgentCompile)"/>
<!-- Compile Agent configuration -->
<Agent Name="Compile Editor Agent $(Platform)$(AgentModifier)" Type="$($(Platform)CompileAgentType)">
<Node Name="$(CompileNodeName)">
<SetVersion Change="$(Change)" Branch="$(EscapedBranch)" If="$(IsBuildMachine)"/>
<Compile Target="ShaderCompileWorker" Platform="$(Platform)" Configuration="Development"/>
<Compile Target="CrashReportClientEditor" Platform="$(Platform)" Project="EngineTest" Configuration="Shipping"/>
<Compile Target="EngineTestEditor" Platform="$(Platform)" Project="EngineTest" Configuration="Development" Arguments="$(EditorCompileArgs)"/>
</Node>
</Agent>
<Label Category="$(CompileCategory)" Name="EngineTest Editor Compile" Requires="$(CompileNodeName)"/>
<!-- Set up properties for run and upload nodes -->
<Property Name="RunEditorWorkflowsNodeRequires" Value="$(CompileNodeName)"/>
<Property Name="UploadEditorWorkflowsNodeList" Value=""/>
<Property Name="RunEditorWorkflowsNodeList" Value=""/>
<!-- Configure EditorWorkflows Agent -->
<Agent Name="EditorWorkflows Agent $(Platform) EngineTest" Type="EditorPerf$(Platform)">
<Property Name="RunEditorWorkflowsNodeName" Value="Run $(EditorWorkflowsOutputName)" />
<Node Name="$(RunEditorWorkflowsNodeName)" Requires="$(RunEditorWorkflowsNodeRequires);$(RunEditorWorkflowsNodeList)">
<Expand Name="RunEditorWorkflowsTest" Platform="$(Platform)" ProjectName="EngineTest" NodeName="$(RunEditorWorkflowsNodeName)"/>
</Node>
<Property Name="RunEditorWorkflowsNodeList" Value="$(RunEditorWorkflowsNodeList);$(RunEditorWorkflowsNodeName)" />
<Property Name="RunNodeUploadTraces" Value="Upload $(EditorWorkflowsOutputName) Traces"/>
<!-- Set up Node for uploading traces -->
<Node Name="$(RunNodeUploadTraces)">
<Expand Name="UploadEditorWorkflowsPerformanceDataAndTraces" Platform="$(Platform)" ProjectName="EngineTest"/>
</Node>
<!-- Update UploadEditorWorkflowsNodeList -->
<Property Name="UploadEditorWorkflowsNodeList" Value="$(UploadEditorWorkflowsNodeList);$(RunNodeUploadTraces)"/>
</Agent>
<Label Category="$(RunCategory)" Name="EngineTest Editor Run" Requires="$(RunEditorWorkflowsNodeRequires);$(RunEditorWorkflowsNodeList);$(UploadEditorWorkflowsNodeList)" UgsBadge="EngineTest Editor Run"/>
<Property Name="RunEditorWorkflowsGraphNodes" Value="$(RunEditorWorkflowsGraphNodes);$(RunEditorWorkflowsNodeList);$(UploadEditorWorkflowsNodeList)"/>
</ForEach>
<!-- End ForEach Platforms -->
<!-- These Nodes run the Editor Workflows test and gather profile data -->
<Aggregate Name="Run EditorWorkflows Tests" Requires="$(RunEditorWorkflowsGraphNodes)"/>
<!-- These Nodes run the Editor and gather profile data -->
<Aggregate Name="Run EditorPerf Tests" Requires="$(RunGraphNodes)"/>
<!-- These Nodes copies the CSV telemetry files to special location in the depot, thus making them the "baselines" -->
<Aggregate Name="Baseline EditorPerf Results" Requires="$(BaselineGraphNodes)"/>
<!-- This Node submits the baseline CSV files to Perforce -->
<!--
<Agent Name="Submission Agent Win64" Type="Win64">
<Node Name="Submit Baseline To Perforce" Requires="$(BaselineGraphNodes)">
<Submit Description="[CL $(Change)] Updated EditorPerf baselines" Files="$(BaselineFiles)"/>
</Node>
</Agent>
-->
</BuildGraph>