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)" />
2021-10-04 17:28:23 -04:00
<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" />
2022-12-05 12:34:24 -05:00
<Option Name= "SingleAgentCompile" Restrict= "true|false" DefaultValue= "false" Description= "Run all compile steps on same agent" />
2023-09-13 13:44:07 -04:00
<Option Name= "AdditionalEditorCompileArgs" DefaultValue= "" Description= "Additional Compile Arguments for the Editor" />
2021-08-20 10:27:07 -04:00
<!-- 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" />
2023-05-31 16:20:30 -04:00
<Property Name= "Win64CompileAgentType" Value= "Win64Compile;Win64" />
2021-08-20 10:27:07 -04:00
<Property Name= "MacCompileAgentType" Value= "TestMac" />
2023-03-30 16:44:58 -04:00
<Property Name= "LinuxCompileAgentType" Value= "Linux" />
2021-08-20 10:27:07 -04:00
<Error Message= "No platforms specified" If= "'$(Platforms)' == ''" />
<!-- Build Options -->
2022-12-05 12:34:24 -05:00
<Option Name= "NoDebugInfo" Restrict= "true|false" DefaultValue= "false" Description= "Compile without including debug info" />
2023-03-30 16:44:58 -04:00
<Option Name= "WithTSAN" Restrict= "true|false" DefaultValue= "false" Description= "Compile using TSAN" />
2021-08-20 10:27:07 -04:00
<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>
2021-09-16 20:02:03 -04:00
<Property Name= "EditorCompileArgs" Value= "" />
<Property Name= "EditorCompileArgs" Value= "-BuildPlugin=$(ExtraPluginsPlusDelims)" If= "'$(ExtraPluginsPlusDelims)' != ''" />
2022-12-05 12:34:24 -05:00
<Property Name= "EditorCompileArgs" Value= "$(EditorCompileArgs) -nodebuginfo" If= "$(NoDebugInfo)" />
2023-03-30 16:44:58 -04:00
<Property Name= "EditorCompileArgs" Value= "$(EditorCompileArgs) -EnableTSAN -Monolithic" If= "$(WithTSAN)" />
2023-09-13 13:44:07 -04:00
<Property Name= "EditorCompileArgs" Value= "$(EditorCompileArgs) $(AdditionalEditorCompileArgs)" If= "'$(AdditionalEditorCompileArgs)' != ''" />
2021-08-20 10:27:07 -04:00
<!-- 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'" />
2023-07-25 20:24:23 -04:00
<Property Name= "AutomationNetworkRootDir" Value= "/mnt/Builds/Automation/Reports/EditorPerf" If= "'$(HostPlatform)' == 'Linux'" />
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 -->
2022-11-28 19:16:48 -05:00
<Option Name= "EnableBasePhaseTests" DefaultValue= "true" Description= "Enable the base phase perf tests." />
2021-08-20 10:27:07 -04:00
<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-11-03 19:58:01 -04:00
<Option Name= "Iterations" DefaultValue= "1" Description= "The list of iteration numbers to run. For example '1;2;3' for three iterations" />
2021-08-20 10:27:07 -04:00
2022-12-07 18:21:54 -05:00
<!-- Full Map Asset Path to run for tests per project -->
2023-05-01 15:48:14 -04:00
<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 " />
2022-12-07 18:21:54 -05:00
2023-06-13 16:46:06 -04:00
<!-- 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)" />
2022-12-07 18:21:54 -05:00
<!-- 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)" />
2023-03-07 15:37:47 -05:00
<Property Name= "$(Project)MapArgs" Value= "-ini:Engine:[/Script/Engine.AutomationTestSettings]:MapsToPIETest=\"$(MapAsset)\"" If= "'$(MapAsset)' != ''" />
2022-12-07 18:21:54 -05:00
</ForEach>
2023-03-30 16:44:58 -04:00
<!-- Options for extra runtime args -->
<Option Name= "AdditionalRuntimeArgs" DefaultValue= "" Description= "Additional Arguments to pass to RunTest" />
2022-12-07 18:21:54 -05:00
2023-05-01 15:48:14 -04:00
<!-- 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>
2022-11-28 19:16:48 -05:00
<!-- Options for extra Zen Loader tests -->
2022-10-27 15:27:55 -04:00
<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." />
2022-10-13 10:52:46 -04:00
<!-- Zen Loader tests specifc arguments -->
2022-10-27 15:27:55 -04:00
<Property Name= "ZenLoaderTestArgs" Value= "-zenloader" />
2023-03-07 15:37:47 -05:00
<Property Name= "ZenLoaderAsyncTestArgs" Value= "$(ZenLoaderTestArgs) -asyncloadingthread" />
2022-10-27 15:27:55 -04:00
2023-03-07 15:37:47 -05:00
<Property Name= "ZenLoaderTestArgs" Value= "$(ZenLoaderTestArgs) -noeditordomain" If= "$(EnableZenTestsWithoutEditorDomain)" />
<Property Name= "ZenLoaderAsyncTestArgs" Value= "$(ZenLoaderAsyncTestArgs) -noeditordomain" If= "$(EnableZenTestsWithoutEditorDomain)" />
2022-10-13 10:52:46 -04:00
2022-11-28 19:16:48 -05:00
<!-- 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" />
2023-03-07 15:37:47 -05:00
<Property Name= "ZenStoreCommonArgs" Value= "-ini:Engine:[Zen.AutoLaunch]:LimitProcessLifetime=true -ZenDataPath=$(ZenServerCache) " />
2022-11-28 19:16:48 -05:00
<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" />
2023-03-07 15:37:47 -05:00
<Property Name= "LazyLoadZenTestArgs" Value= "$(LazyLoadTestArgs) -zenloader" />
2022-11-28 19:16:48 -05:00
2021-08-20 10:27:07 -04:00
<!-- Gauntlet arguments for all runs -->
2023-07-31 09:29:53 -04:00
<Property Name= "GauntletArgs" Value= "-build=editor -verbose -tempdir="$(RootDir)/Tests"" />
2021-08-20 10:27:07 -04:00
<Property Name= "GauntletArgs" Value= "$(GauntletArgs) -branch=$(Branch) -ECBranch="$(Branch)" -ECChangelist="$(Change)"" />
<Property Name= "GauntletArgs" Value= "$(GauntletArgs) -maxduration=28800" />
<!-- Gauntlet arguments for profile runs -->
2023-07-21 21:34:35 -04:00
<Property Name= "ProfileArgs" Value= "-test=EditorTests -tracefiletrunc" />
2021-08-20 10:27:07 -04:00
<Property Name= "ProfileArgs" Value= "$(ProfileArgs) -EnablePlugins=$(ExtraPluginsCommaDelims)" If= "'$(ExtraPluginsCommaDelims)' != ''" />
2021-09-15 16:52:23 -04:00
<Property Name= "ProfileArgs" Value= "$(ProfileArgs) -SuppressLogWarnings -SuppressLogErrors" />
2021-08-20 10:27:07 -04:00
<Property Name= "ProfileArgs" Value= "$(ProfileArgs) -GameInstanceLostTimerSeconds=3600" />
<Property Name= "ProfileArgs" Value= "$(ProfileArgs) -NoLoadLevelAtStartup -Benchmarking -NODDCCLEANUP" />
<Property Name= "ProfileArgs" Value= "$(ProfileArgs) -NoShaderDistrib -VerboseShaderLogging" />
2023-07-31 09:29:53 -04:00
<Property Name= "ProfileArgs" Value= "$(ProfileArgs) -ResumeOnCriticalFailure" />
2021-08-20 10:27:07 -04:00
2023-05-09 16:27:59 -04:00
<!-- options for summarize runs -->
2023-05-09 16:28:22 -04:00
<Option Name= "RunTraceSummary" DefaultValue= "false" Description= "Summarize the insights trace after the run" />
2023-05-09 16:27:59 -04:00
2021-08-20 10:27:07 -04:00
<!-- Gauntlet arguments for commandlet, summarize runs -->
2022-06-20 13:06:30 -04:00
<Property Name= "CommandletArgs" Value= "-notraceserver" />
2021-08-20 10:27:07 -04:00
<Property Name= "SummarizeArgs" Value= "" />
<Property Name= "SummarizeArgs" Value= "-skipbaseline" If= "$(RunAndBaseline)" />
2021-10-26 10:13:23 -04:00
<!-- Publish telemetry options -->
<Option Name= "TelemetryConfig" DefaultValue= "" Description= "The configuration to use when publishing telemetry data to a database" />
2023-05-09 16:27:59 -04:00
<Property Name= "TelemetryConfig" Value= "UETelemetryStaging" If= "$(IsBuildMachine) And $(IsPreflight) And '$(TelemetryConfig)' == '' And $(RunTraceSummary)" />
<Property Name= "TelemetryConfig" Value= "UETelemetry" If= "$(IsBuildMachine) And '$(TelemetryConfig)' == '' And $(RunTraceSummary)" />
2021-10-26 10:13:23 -04:00
2021-08-20 10:27:07 -04:00
<!-- The main test running macro logic that is expanded with platform and dependency node names -->
2023-05-01 15:48:14 -04:00
<Macro Name= "RunTest" Arguments= "TestNameSuffix;Platform;ProjectName;ProjectTarget;NodeName;Phase;Iteration;Args;EditorArgs" >
2022-10-27 15:27:55 -04:00
<Property Name= "TestName" Value= "EditorPerf$(Phase)$(TestNameSuffix)" />
2023-07-21 21:34:35 -04:00
<Property Name= "TestFilter" Value= "Project.Iteration.PIE" />
2023-07-31 09:29:53 -04:00
<Property Name= "TestFilterArgs" Value= "-runtest=$(TestFilter)" />
2022-10-27 15:27:55 -04:00
<Property Name= "IterationSuffix" Value= "" />
<Property Name= "IterationSuffix" Value= "$(Iteration)" If= "'$(Iteration)' != '1'" />
2023-05-01 15:48:14 -04:00
<Property Name= "TestOutputDir" Value= "$(AutomationOutputDir)/$(ProjectName)$(Platform)EditorPerf" />
2022-10-27 15:27:55 -04:00
2023-05-01 15:48:14 -04:00
<Property Name= "IterationName" Value= "$(ProjectName)$(Platform)$(TestName)$(IterationSuffix)" />
2021-11-03 19:58:01 -04:00
<Property Name= "TraceFilePath" Value= "$(TraceDir)/$(IterationName).utrace" />
<Property Name= "TelemetryFileName" Value= "$(IterationName)Telemetry.csv" />
<Property Name= "TelemetryFilePath" Value= "$(TraceDir)/$(TelemetryFileName)" />
2023-06-16 13:20:57 -04:00
2022-10-27 15:27:55 -04:00
<Property Name= "LogOutputParams" Value= "-logdir="$(TestOutputDir)"" />
2021-11-03 19:58:01 -04:00
<Property Name= "ReportParams" Value= "-WriteTestResultsForHorde -HordeTestDataKey="$(NodeName)$(PreflightSuffix)"" />
2022-10-27 15:27:55 -04:00
<Property Name= "ArtifactName" Value= "$(Phase)$(IterationSuffix)$(TestNameSuffix)" />
2023-05-01 15:48:14 -04:00
<Property Name= "AllGauntletArgs" Value= "-Project=$(ProjectTarget) -Platform=$(Platform) $(GauntletArgs) $(ReportParams) $(LogOutputParams) -artifactname="$(ArtifactName)"" />
2022-12-07 18:21:54 -05:00
<Property Name= "RunArgs" Value= "$(Args) -editorargs="$(EditorArgs)"" />
2021-08-20 10:27:07 -04:00
2021-11-03 19:58:01 -04:00
<!-- Do DDC cleanup outside the editor process, handles Cold cleanup without changing stats -->
2023-05-01 15:48:14 -04:00
<!-- <Commandlet Project="$(ProjectTarget)" Name="DDCCleanup" Arguments="$(Args) $(CommandletArgs)"/> -->
2021-08-20 10:27:07 -04:00
2021-11-03 19:58:01 -04:00
<!-- Run the Gauntlet EditorPerf Tests -->
2023-07-21 21:34:35 -04:00
<Command Name= "RunUnreal" Arguments= "$(AllGauntletArgs) $(ProfileArgs) $(TestFilterArgs) $(RunArgs) -sessionlabel="$(TestName)" -tracefile="$(TraceFilePath)"" />
2021-08-20 10:27:07 -04:00
2021-11-03 19:58:01 -04:00
<!-- Translate the utrace file into csv data -->
2023-05-09 16:27:59 -04:00
<Do If= "$(RunTraceSummary)" >
<Commandlet Project= "$(ProjectTarget)" Name= "SummarizeTrace" Arguments= "-inputfile="$(TraceFilePath)" -testname="$(TestName)" $(SummarizeArgs) $(CommandletArgs)" />
</Do>
2023-06-16 13:20:57 -04:00
2021-11-03 19:58:01 -04:00
<Do If= "'$(TelemetryConfig)' != ''" >
<!-- Publish telemetry to the db -->
<Command Name= "PublishUnrealAutomationTelemetry" Arguments= "-CSVFile="$(TelemetryFilePath)" -project=$(Project) -changelist=$(Change) -branch=$(Branch) -TelemetryConfig=$(TelemetryConfig)" />
2023-06-16 13:20:57 -04:00
</Do>
</Macro>
2023-07-21 21:34:35 -04:00
<!-- 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" />
2023-08-09 13:47:29 -04:00
<Property Name= "TestFilterArgs" Value= "-runtest=$(TestName)" />
2023-07-21 21:34:35 -04:00
<Property Name= "TestOutputDir" Value= "$(AutomationOutputDir)/$(ProjectName)$(Platform)EditorWorkflows" />
2023-08-09 13:47:29 -04:00
<Property Name= "TraceFilePath" Value= "$(TraceDir)/$(TestName)/$(ProjectName)$(Platform)EditorWorkflows.utrace" />
2023-07-21 21:34:35 -04:00
<Property Name= "LogOutputParams" Value= "-logdir="$(TestOutputDir)"" />
<Property Name= "ReportParams" Value= "-WriteTestResultsForHorde -HordeTestDataKey="$(NodeName)$(PreflightSuffix)"" />
<Property Name= "AllGauntletArgs" Value= "-Project=$(ProjectName) -Platform=$(Platform) $(GauntletArgs) $(ReportParams) $(LogOutputParams)" />
<Command Name= "RunUnreal" Arguments= "$(AllGauntletArgs) $(ProfileArgs) $(TestFilterArgs) -sessionlabel="$(TestName)" -tracefile="$(TraceFilePath)"" />
</Macro>
2023-06-16 13:20:57 -04:00
<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)" />
2021-08-20 10:27:07 -04:00
</Macro>
2023-07-21 21:34:35 -04:00
<Macro Name= "UploadEditorWorkflowsPerformanceDataAndTraces" Arguments= "Platform;ProjectName" >
<Property Name= "TestOutputDir" Value= "$(AutomationOutputDir)/$(ProjectName)$(Platform)EditorWorkflows" />
2023-08-09 13:47:29 -04:00
<Property Name= "TraceFilePath" Value= "$(TraceDir)/Editor.Workflows/$(ProjectName)$(Platform)EditorWorkflows.utrace" />
<!-- Translate the utrace file into csv data -->
<Commandlet Project= "$(ProjectName)" Name= "SummarizeTraceEditorWorkflows" Arguments= "-inputfile="$(TraceFilePath)" -testname="Editor.Workflows" $(CommandletArgs)" />
2023-08-02 15:38:09 -04:00
<!-- Copy the utrace file and the generated csv performance data to the output directory -->
<Copy From= "$(TraceDir)/Editor.Workflows/*" To= "$(TestOutputDir)/Editor.Workflows" Overwrite= "true" />
<!-- Copy "index.json" that captures the functional results to the output directory -->
<Copy From= "$(RootDir)/Tests/TestReport/index.json" To= "$(TestOutputDir)/Editor.Workflows/index.json" Overwrite= "true" />
2023-07-21 21:34:35 -04:00
</Macro>
<!-- These will be set to the names of all nodes we want to execute based on specified platforms/options -->
2021-08-20 10:27:07 -04:00
<Property Name= "RunGraphNodes" Value= "" />
2023-07-21 21:34:35 -04:00
<Property Name= "RunEditorWorkflowsGraphNodes" Value= "" />
2021-08-20 10:27:07 -04:00
<!-- 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)" >
2021-09-16 20:42:29 -04:00
<!-- ForEach Project to run, generate the graph nodes -->
<ForEach Name= "Project" Values= "$(Projects)" >
2021-08-20 10:27:07 -04:00
2021-09-27 19:39:25 -04:00
<!-- We parse the Editor target name from within [] in case it's not $(Project)Editor -->
2021-09-16 20:42:29 -04:00
<Property Name= "EditorTarget" Value= "$(Project)Editor" />
<Regex Pattern= "(.*)\[(.*)\]" Capture= "Project;EditorTarget" Input= "$(Project)" Optional= "true" />
2023-05-01 15:48:14 -04:00
<!-- 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" />
2022-12-07 18:21:54 -05:00
<!-- Project Map Args -->
2023-05-01 17:47:48 -04:00
<Property Name= "ProjectCombinedArgs" Value= "$($(Project)SpecificArgs) $($(Project)MapArgs) $(AdditionalRuntimeArgs)" />
2022-12-07 18:21:54 -05:00
2021-09-27 19:39:25 -04:00
<!-- Use as base string for directories and key for node names -->
2021-09-16 20:42:29 -04:00
<Property Name= "OutputName" Value= "$(Project)$(Platform)EditorPerf" />
2021-10-04 17:28:23 -04:00
<!-- Compile the Editor -->
<Property Name= "CompileNodeName" Value= "Compile $(Project) $(Platform)" />
2022-12-05 12:34:24 -05:00
<Property Name= "AgentModifier" Value= "" />
<Property Name= "AgentModifier" Value= " $(Project)" If= "!$(SingleAgentCompile)" />
<Agent Name= "Compile Editor Agent $(Platform)$(AgentModifier" Type= "$($(Platform)CompileAgentType)" >
2021-10-04 17:28:23 -04:00
<Node Name= "$(CompileNodeName)" >
2022-06-06 11:28:11 -04:00
<SetVersion Change= "$(Change)" Branch= "$(EscapedBranch)" If= "$(IsBuildMachine)" />
2021-09-27 19:39:25 -04:00
<Compile Target= "ShaderCompileWorker" Platform= "$(Platform)" Configuration= "Development" />
2023-05-01 15:48:14 -04:00
<Compile Target= "CrashReportClientEditor" Platform= "$(Platform)" Project= "$(ProjectTarget)" Configuration= "Shipping" />
<Compile Target= "$(EditorTarget)" Platform= "$(Platform)" Project= "$(ProjectTarget)" Configuration= "Development" Arguments= "$(EditorCompileArgs)" />
2021-09-16 20:02:03 -04:00
</Node>
2021-09-20 16:43:30 -04:00
</Agent>
2022-05-09 20:55:59 -04:00
<Label Category= "$(CompileCategory)" Name= "$(Project) Editor Compile" Requires= "$(CompileNodeName)" />
2021-09-20 16:43:30 -04:00
2021-10-04 17:28:23 -04:00
<!-- Run the Tests -->
<Property Name= "RunNodeRequires" Value= "$(CompileNodeName)" />
2021-11-03 23:16:02 -04:00
<Property Name= "RunNodeList" Value= "" /> <!-- Each node in this the nested loops below, they need to depend on predecessors -->
2023-06-16 13:20:57 -04:00
<Property Name= "UploadNodeList" Value= "" />
2021-09-20 16:43:30 -04:00
<Agent Name= "EditorPerf Agent $(Platform) $(Project)" Type= "EditorPerf$(Platform)" >
2021-11-03 19:58:01 -04:00
<ForEach Name= "Phase" Values= "$(Phases)" >
2022-11-28 19:16:48 -05:00
<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)" >
2023-05-01 15:48:14 -04:00
<Expand Name= "RunTest" TestNameSuffix= "" Platform= "$(Platform)" ProjectName= "$(Project)" ProjectTarget= "$(ProjectTarget)" NodeName= "$(RunNodeName)" Phase= "$(Phase)" Iteration= "$(Iteration)" Args= "$($(Phase)Args)" EditorArgs= "$(ProjectCombinedArgs)" />
2022-11-28 19:16:48 -05:00
</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)" >
2023-05-01 15:48:14 -04:00
<Expand Name= "RunTest" TestNameSuffix= "Zen" Platform= "$(Platform)" ProjectName= "$(Project)" ProjectTarget= "$(ProjectTarget)" NodeName= "$(RunNodeZenName)" Phase= "$(Phase)" Iteration= "1" Args= "$($(Phase)Args)" EditorArgs= "$(ProjectCombinedArgs) $(ZenLoaderTestArgs)" />
2022-11-28 19:16:48 -05:00
</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)" >
2023-05-01 15:48:14 -04:00
<Expand Name= "RunTest" TestNameSuffix= "ZenAsync" Platform= "$(Platform)" ProjectName= "$(Project)" ProjectTarget= "$(ProjectTarget)" NodeName= "$(RunNodeZenAsyncName)" Phase= "$(Phase)" Iteration= "1" Args= "$($(Phase)Args)" EditorArgs= "$(ProjectCombinedArgs) $(ZenLoaderAsyncTestArgs)" />
2022-11-28 19:16:48 -05:00
</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)" >
2023-05-01 15:48:14 -04:00
<Expand Name= "RunTest" TestNameSuffix= "ZenAsync" Platform= "$(Platform)" ProjectName= "$(Project)" ProjectTarget= "$(ProjectTarget)" NodeName= "$(RunNodeZenStoreDDCName)" Phase= "$(Phase)" Iteration= "1" Args= "$(ZenStoreDDCPhaseArgs)" EditorArgs= "$(ProjectCombinedArgs) $(ZenStoreDDCTestArgs)" />
2022-11-28 19:16:48 -05:00
</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)" >
2023-05-01 15:48:14 -04:00
<Expand Name= "RunTest" TestNameSuffix= "Zen" Platform= "$(Platform)" ProjectName= "$(Project)" ProjectTarget= "$(ProjectTarget)" NodeName= "$(RunNodeLazyLoadName)" Phase= "$(Phase)" Iteration= "1" Args= "$($(Phase)Args)" EditorArgs= "$(ProjectCombinedArgs) $(LazyLoadTestArgs)" />
2022-11-28 19:16:48 -05:00
</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)" >
2023-05-01 15:48:14 -04:00
<Expand Name= "RunTest" TestNameSuffix= "Zen" Platform= "$(Platform)" ProjectName= "$(Project)" ProjectTarget= "$(ProjectTarget)" NodeName= "$(RunNodeLazyLoadZenName)" Phase= "$(Phase)" Iteration= "1" Args= "$($(Phase)Args)" EditorArgs= "$(ProjectCombinedArgs) $(LazyLoadZenTestArgs)" />
2022-11-28 19:16:48 -05:00
</Node>
<Property Name= "RunNodeList" Value= "$(RunNodeList);$(RunNodeLazyLoadZenName)" If= "$(EnableLazyLoadZenTest)" />
</Do>
2021-11-03 19:58:01 -04:00
</ForEach>
2023-06-16 13:20:57 -04:00
<Property Name= "RunNodeUploadPhaseTraces" Value= "Upload $(OutputName) Traces" />
<Node Name= "$(RunNodeUploadPhaseTraces)" >
<Expand Name= "UploadTestTraces" Platform= "$(Platform)" ProjectName= "$(Project)" />
</Node>
<Property Name= "UploadNodeList" Value= "$(RunNodeUploadPhaseTraces)" />
2021-10-04 17:28:23 -04:00
</Agent>
2023-06-16 13:20:57 -04:00
<Label Category= "$(RunCategory)" Name= "$(Project) Editor Run" Requires= "$(RunNodeRequires);$(RunNodeList);$(UploadNodeList)" UgsBadge= "$(Project) Editor Run" />
<Property Name= "RunGraphNodes" Value= "$(RunGraphNodes);$(RunNodeList);$(UploadNodeList)" />
2021-08-20 10:27:07 -04:00
2021-10-04 17:28:23 -04:00
<!-- 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)" >
2021-08-20 10:27:07 -04:00
<Node Name= "$(BaselineNodeName)" Requires= "$(BaselineNodeRequires)" >
<ForEach Name= "Phase" Values= "$(Phases)" >
<Expand Name= "BaselineResult" Platform= "$(Platform)" Project= "$(Project)" Phase= "$(Phase)" />
</ForEach>
</Node>
2021-09-16 20:42:29 -04:00
</Agent>
2022-05-09 20:55:59 -04:00
<Label Category= "$(BaselineCategory)" Name= "$(Project) Perf Baseline" Requires= "$(BaselineNodeName)" />
2021-08-20 10:27:07 -04:00
2021-09-16 20:42:29 -04:00
</ForEach> <!-- Projects -->
2021-08-20 10:27:07 -04:00
</ForEach> <!-- Platforms -->
2023-07-21 21:34:35 -04:00
<!-- Generate graph nodes for each platform to run -->
<ForEach Name= "Platform" Values= "$(Platforms)" >
2023-08-09 13:47:29 -04:00
<Property Name= "ProjectName" Value= "EngineTest" />
2023-07-21 21:34:35 -04:00
<!-- Define output name for the EditorWorkflows test -->
2023-08-09 13:47:29 -04:00
<Property Name= "EditorWorkflowsOutputName" Value= "$(ProjectName)$(Platform)EditorWorkflows" />
<Property Name= "CompileNodeName" Value= "Compile $(ProjectName) $(Platform) EditorWorkflows" />
2023-07-21 21:34:35 -04:00
<Property Name= "AgentModifier" Value= "" />
2023-08-09 13:47:29 -04:00
<Property Name= "AgentModifier" Value= " $(ProjectName)" If= "!$(SingleAgentCompile)" />
2023-07-21 21:34:35 -04:00
<!-- 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" />
2023-08-09 13:47:29 -04:00
<Compile Target= "CrashReportClientEditor" Platform= "$(Platform)" Project= "$(ProjectName)" Configuration= "Shipping" />
<Compile Target= "$(ProjectName)Editor" Platform= "$(Platform)" Project= "$(ProjectName)" Configuration= "Development" Arguments= "$(EditorCompileArgs)" />
2023-07-21 21:34:35 -04:00
</Node>
</Agent>
2023-08-09 13:47:29 -04:00
<Label Category= "$(CompileCategory)" Name= "$(ProjectName) Editor Compile" Requires= "$(CompileNodeName)" />
2023-07-21 21:34:35 -04:00
<!-- Set up properties for run and upload nodes -->
<Property Name= "RunEditorWorkflowsNodeRequires" Value= "$(CompileNodeName)" />
<Property Name= "UploadEditorWorkflowsNodeList" Value= "" />
<Property Name= "RunEditorWorkflowsNodeList" Value= "" />
<!-- Configure EditorWorkflows Agent -->
2023-08-09 13:47:29 -04:00
<Agent Name= "EditorWorkflows Agent $(Platform) $(ProjectName)" Type= "EditorPerf$(Platform)" >
2023-07-21 21:34:35 -04:00
<Property Name= "RunEditorWorkflowsNodeName" Value= "Run $(EditorWorkflowsOutputName)" />
<Node Name= "$(RunEditorWorkflowsNodeName)" Requires= "$(RunEditorWorkflowsNodeRequires);$(RunEditorWorkflowsNodeList)" >
2023-08-09 13:47:29 -04:00
<Expand Name= "RunEditorWorkflowsTest" Platform= "$(Platform)" ProjectName= "$(ProjectName)" NodeName= "$(RunEditorWorkflowsNodeName)" />
2023-07-21 21:34:35 -04:00
</Node>
<Property Name= "RunEditorWorkflowsNodeList" Value= "$(RunEditorWorkflowsNodeList);$(RunEditorWorkflowsNodeName)" />
<Property Name= "RunNodeUploadTraces" Value= "Upload $(EditorWorkflowsOutputName) Traces" />
<!-- Set up Node for uploading traces -->
<Node Name= "$(RunNodeUploadTraces)" >
2023-08-09 13:47:29 -04:00
<Expand Name= "UploadEditorWorkflowsPerformanceDataAndTraces" Platform= "$(Platform)" ProjectName= "$(ProjectName)" />
2023-07-21 21:34:35 -04:00
</Node>
<!-- Update UploadEditorWorkflowsNodeList -->
<Property Name= "UploadEditorWorkflowsNodeList" Value= "$(UploadEditorWorkflowsNodeList);$(RunNodeUploadTraces)" />
</Agent>
2023-08-09 13:47:29 -04:00
<Label Category= "$(RunCategory)" Name= "$(ProjectName) Editor Run" Requires= "$(RunEditorWorkflowsNodeRequires);$(RunEditorWorkflowsNodeList);$(UploadEditorWorkflowsNodeList)" UgsBadge= "$(ProjectName) Editor Run" />
2023-07-21 21:34:35 -04:00
<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)" />
2021-08-20 10:27:07 -04:00
<!-- 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>