Files
UnrealEngineUWP/Engine/Source/Programs/AutomationTool/Scripts/RebuildLightMapsCommand.Automation.cs
Andrew Grant f25badee7f Copying //UE4/Orion-Staging to //UE4/Main (Origin: //Orion/Dev-General @2826496)
#lockdown Nick.Penwarden

==========================
MAJOR FEATURES + CHANGES
==========================

Change 2826201 on 2016/01/13 by Zabir.Hoque

	Add more verbose logging to try to understand #OR-11297

	#lockdown Andrew.Grant
	#CodeReview Marcus.Wassmer
	#RB none
	#TESTS compiled Win64 debug editor, ran agora_p

Change 2826170 on 2016/01/13 by Marcus.Wassmer

	Flush unloaded resource properly in LoadMap
	#codereview Gil.Gribb
	#rb none
	#test cycling game.  memory is freed properly now.
	#lockdown Andrew.Grant

Change 2826135 on 2016/01/12 by Michael.Noland

	Orion: Improve login screen on PC to reduce the potential impact of framerate on data center ping calculation
	- Disabled async streaming for the duration of the QOS ping measurement to avoid hitches
	- Added a circular throbber in the top left corner of the login screen indicating that something is async streaming (as a diagnostic tool for users affected by the datacenter ping, can be removed in the future)
	- Added logging of the current average frame time when the datacenter ping is finalized
	- Added a 'Pick Ideal Settings' button to the login screen (note: on the actual screen, not the login widget, so it will not appear on PS4)
	#jira OR-12453
	#rb paul.moore
	#tests Ran a QOS server and client and verified that the new logging is occurring, tried out the new benchmark button, etc...

	Merging CL# 2826128 using //Orion/Main_to_//Orion/Dev-General

Change 2826131 on 2016/01/12 by Michael.Noland

	#UE4 - added print out of MS/FPS during Qos ping evaluation
	#rb michael.noland
	#tests loaded up through login screen to see output

	Merging CL# 2825678 using //Orion/Main_to_//Orion/Dev-General

Change 2826128 on 2016/01/12 by Michael.Noland

	Orion: Improve login screen on PC to reduce the potential impact of framerate on data center ping calculation
	- Disabled async streaming for the duration of the QOS ping measurement to avoid hitches
	- Added a circular throbber in the top left corner of the login screen indicating that something is async streaming (as a diagnostic tool for users affected by the datacenter ping, can be removed in the future)
	- Added logging of the current average frame time when the datacenter ping is finalized
	- Added a 'Pick Ideal Settings' button to the login screen (note: on the actual screen, not the login widget, so it will not appear on PS4)
	#jira OR-12453
	#rb paul.moore
	#tests Ran a QOS server and client and verified that the new logging is occurring, tried out the new benchmark button, etc...

	Merging CL# 2826116 using //Orion/Release-Next->//Orion/Main

Change 2826116 on 2016/01/12 by Michael.Noland

	Orion: Improve login screen on PC to reduce the potential impact of framerate on data center ping calculation
	- Disabled async streaming for the duration of the QOS ping measurement to avoid hitches
	- Added a circular throbber in the top left corner of the login screen indicating that something is async streaming (as a diagnostic tool for users affected by the datacenter ping, can be removed in the future)
	- Added logging of the current average frame time when the datacenter ping is finalized
	- Added a 'Pick Ideal Settings' button to the login screen (note: on the actual screen, not the login widget, so it will not appear on PS4)
	#jira OR-12453
	#rb paul.moore
	#tests Ran a QOS server and client and verified that the new logging is occurring, tried out the new benchmark button, etc...
	#lockdown andrew.grant
	#codereview josh.markiewicz

Change 2825772 on 2016/01/12 by Dmitry.Rekman

	Linux signal handling improvements.

	- Switch crash handlers to use "crash malloc" (preallocated memory) on crash.
	- Remove unnecessary memory allocations from graceful termination handler.

	#rb none
	#tests Run the Linux server and crashed it a few times.
	#codereview David.Vossel, Michael.Trepka

Change 2825768 on 2016/01/12 by Josh.Markiewicz

	#UE4 - added print out of MS/FPS during Qos ping evaluation
	#rb michael.noland
	#tests loaded up through login screen to see output

Change 2825703 on 2016/01/12 by Brian.Karis

	Switched on new motion blur. Set temporal AA sharpness to 1.

	#rb none
	#TESTS editor

Change 2825689 on 2016/01/12 by Lina.Halper

	Fix for get animation notify crash

	https://jira.ol.epicgames.net/browse/OR-12248
	https://jira.ol.epicgames.net/browse/OR-12348

	- Also fixed the crash in preview of persona due to blend sample cache contains previous animation data
	- Also fixed blend space player to reinitialize cache data
	- The main issue is marker doesn't clamp the length, causing notifies ensure to trigger.

	#rb : Laurent.Delayen
	#tests: 10 Sparrows bot match for long time
	#code review: Martin.Wilson
	#lockdown: Andrew.Grant

Change 2825680 on 2016/01/12 by Martin.Mittring

	fixed all cases with r.Tonemapper.ScreenPercentage, ScreenPercentage, Fringe, Vignette, ViewRect, flickering with transluceny (View members have been modified while other thread was reading)
	#rb:Olaf.Piesche, David.Hill
	#test: PC, many cases

Change 2825579 on 2016/01/12 by Chris.Bunner

	Force shadow shape bone indices on the required update list.
	#rb Lina.Halper, Rolando.Caloca
	#tests Editor
	#codereview Daniel.Wright
	#jira OR-12339

Change 2825443 on 2016/01/12 by Martin.Mittring
2016-01-14 08:11:47 -05:00

324 lines
9.7 KiB
C#

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System.Reflection;
using System.Linq;
using System.Net.Mail;
using AutomationTool;
using UnrealBuildTool;
/// <summary>
/// Helper command used for rebuilding a projects light maps.
/// </summary>
/// <remarks>
/// Command line parameters used by this command:
/// -project - Absolute path to a .uproject file
/// -MapsToRebuildLightMaps - A list of '+' delimited maps we wish to build lightmaps for.
/// -CommandletTargetName - The Target used in running the commandlet
/// -StakeholdersEmailAddresses - Users to notify of completion
///
/// </remarks>
namespace AutomationScripts.Automation
{
[RequireP4]
public class RebuildLightMaps : BuildCommand
{
// The rebuild lighting process
#region RebuildLightMaps Command
public override void ExecuteBuild()
{
Log("********** REBUILD LIGHT MAPS COMMAND STARTED **********");
try
{
var Params = new ProjectParams
(
Command: this,
// Shared
RawProjectPath: ProjectPath
);
// Sync and build our targets required for the commandlet to run correctly.
// P4.Sync(String.Format("-f {0}/...#head", P4Env.BuildRootP4));
bool NoBuild = ParseParam("nobuild");
if (!NoBuild)
{
BuildNecessaryTargets();
}
CreateChangelist(Params);
RunRebuildLightmapsCommandlet(Params);
SubmitRebuiltMaps();
}
catch (Exception ProcessEx)
{
Log("********** REBUILD LIGHT MAPS COMMAND FAILED **********");
HandleFailure(ProcessEx.Message);
throw ProcessEx;
}
// The processes steps have completed successfully.
HandleSuccess();
Log("********** REBUILD LIGHT MAPS COMMAND COMPLETED **********");
}
#endregion
// Broken down steps used to run the process.
#region RebuildLightMaps Process Steps
private void BuildNecessaryTargets()
{
Log("Running Step:- RebuildLightMaps::BuildNecessaryTargets");
UE4Build.BuildAgenda Agenda = new UE4Build.BuildAgenda();
Agenda.AddTarget("ShaderCompileWorker", UnrealBuildTool.UnrealTargetPlatform.Win64, UnrealBuildTool.UnrealTargetConfiguration.Development);
Agenda.AddTarget("UnrealLightmass", UnrealBuildTool.UnrealTargetPlatform.Win64, UnrealBuildTool.UnrealTargetConfiguration.Development);
Agenda.AddTarget(CommandletTargetName, UnrealBuildTool.UnrealTargetPlatform.Win64, UnrealBuildTool.UnrealTargetConfiguration.Development);
try
{
UE4Build Builder = new UE4Build(this);
Builder.Build(Agenda, InDeleteBuildProducts: true, InUpdateVersionFiles: true, InForceNoXGE: false);
UE4Build.CheckBuildProducts(Builder.BuildProductFiles);
}
catch (AutomationException Ex)
{
LogError("Rebuild Light Maps has failed.");
throw Ex;
}
}
private void CreateChangelist(ProjectParams Params)
{
Log("Running Step:- RebuildLightMaps::CheckOutMaps");
// Setup a P4 Cl we will use to submit the new lightmaps
WorkingCL = P4.CreateChange(P4Env.Client, String.Format("{0} rebuilding lightmaps from changelist {1}\n#rb None\n#tests None", Params.ShortProjectName, P4Env.Changelist));
Log("Working in {0}", WorkingCL);
}
private void RunRebuildLightmapsCommandlet(ProjectParams Params)
{
Log("Running Step:- RebuildLightMaps::RunRebuildLightmapsCommandlet");
// Find the commandlet binary
string UE4EditorExe = HostPlatform.Current.GetUE4ExePath(Params.UE4Exe);
if (!FileExists(UE4EditorExe))
{
LogError("Missing " + UE4EditorExe + " executable. Needs to be built first.");
throw new AutomationException("Missing " + UE4EditorExe + " executable. Needs to be built first.");
}
// Now let's rebuild lightmaps for the project
try
{
var CommandletParams = IsBuildMachine ? "-unattended -buildmachine -fileopenlog" : "-fileopenlog";
CommandletParams += " -AutoCheckOutPackages";
if (P4Enabled)
{
CommandletParams += String.Format(" -SCCProvider={0} -P4Port={1} -P4User={2} -P4Client={3} -P4Changelist={4} -P4Passwd={5}", "Perforce", P4Env.P4Port, P4Env.User, P4Env.Client, WorkingCL.ToString(), P4.GetAuthenticationToken());
}
RebuildLightMapsCommandlet(Params.RawProjectPath, Params.UE4Exe, Params.MapsToRebuildLightMaps.ToArray(), CommandletParams);
}
catch (Exception Ex)
{
// Something went wrong with the commandlet. Abandon this run, don't check in any updated files, etc.
LogError("Rebuild Light Maps has failed. because "+ Ex.ToString());
throw new AutomationException(ExitCode.Error_Unknown, Ex, "RebuildLightMaps failed.");
}
}
private void SubmitRebuiltMaps()
{
Log("Running Step:- RebuildLightMaps::SubmitRebuiltMaps");
// Check everything in!
if (WorkingCL != -1)
{
Log("Running Step:- Submitting CL " + WorkingCL);
int SubmittedCL;
P4.Submit(WorkingCL, out SubmittedCL, true, true);
Log("INFO: Lightmaps successfully submitted in cl "+ SubmittedCL.ToString());
}
}
#endregion
// Helper functions and procedure steps necessary for running the commandlet successfully
#region RebuildLightMaps Helper Functions
/**
* Parse the P4 output for any errors that we really care about.
* e.g. umaps and assets are exclusive checkout files, if we cant check out a map for this reason
* then we need to stop.
*/
private bool FoundCheckOutErrorInP4Output(string Output)
{
bool bHadAnError = false;
var Lines = Output.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
foreach (string Line in Lines)
{
// Check for log spew that matches exclusive checkout failure
// http://answers.perforce.com/articles/KB/3114
if (Line.Contains("can't edit exclusive file already opened"))
{
bHadAnError = true;
break;
}
}
return bHadAnError;
}
/**
* Cleanup anything this build may leave behind and inform the user
*/
private void HandleFailure(String FailureMessage)
{
try
{
if (WorkingCL != -1)
{
P4.RevertAll(WorkingCL);
P4.DeleteChange(WorkingCL);
}
SendCompletionMessage(false, FailureMessage);
}
catch (P4Exception P4Ex)
{
LogError("Failed to clean up P4 changelist: " + P4Ex.Message);
}
catch (Exception SendMailEx)
{
LogError("Failed to notify that build succeeded: " + SendMailEx.Message);
}
}
/**
* Perform any post completion steps needed. I.e. Notify stakeholders etc.
*/
private void HandleSuccess()
{
try
{
SendCompletionMessage(true, "Successfully rebuilt lightmaps.");
}
catch (Exception SendMailEx)
{
LogError("Failed to notify that build succeeded: " + SendMailEx.Message);
}
}
/**
* Notify stakeholders of the commandlet results
*/
void SendCompletionMessage(bool bWasSuccessful, String MessageBody)
{
MailMessage Message = new System.Net.Mail.MailMessage();
Message.Priority = MailPriority.High;
Message.From = new MailAddress("unrealbot@epicgames.com");
foreach (String NextStakeHolder in StakeholdersEmailAddresses)
{
Message.To.Add(new MailAddress(NextStakeHolder));
}
Message.CC.Add(new MailAddress("Terence.Burns@epicgames.com"));
Message.Subject = String.Format("Nightly lightmap rebuild ", bWasSuccessful ? "[SUCCESS]" : "[FAILED]");
Message.Body = MessageBody;
try
{
SmtpClient MailClient = new SmtpClient("smtp.epicgames.net");
MailClient.Send(Message);
}
catch (Exception Ex)
{
LogError("Failed to send notify email to {0} ({1})", String.Join(", ", StakeholdersEmailAddresses.ToArray()), Ex.Message);
}
}
#endregion
// Member vars used in multiple steps.
#region RebuildLightMaps Property Set-up
// Users to notify if the process fails or succeeds.
List<String> StakeholdersEmailAddresses
{
get
{
String UnprocessedEmailList = ParseParamValue("StakeholdersEmailAddresses");
if (String.IsNullOrEmpty(UnprocessedEmailList) == false)
{
return UnprocessedEmailList.Split('+').ToList();
}
else
{
return null;
}
}
}
// The Changelist used when doing the work.
private int WorkingCL = -1;
// The target name of the commandlet binary we wish to build and run.
private String CommandletTargetName
{
get
{
return ParseParamValue("CommandletTargetName", "");
}
}
// Process command-line and find a project file. This is necessary for the commandlet to run successfully
private FileReference ProjectFullPath;
public virtual FileReference ProjectPath
{
get
{
if (ProjectFullPath == null)
{
var OriginalProjectName = ParseParamValue("project", "");
var ProjectName = OriginalProjectName;
ProjectName = ProjectName.Trim(new char[] { '\"' });
if (ProjectName.IndexOfAny(new char[] { '\\', '/' }) < 0)
{
ProjectName = CombinePaths(CmdEnv.LocalRoot, ProjectName, ProjectName + ".uproject");
}
else if (!FileExists_NoExceptions(ProjectName))
{
ProjectName = CombinePaths(CmdEnv.LocalRoot, ProjectName);
}
if (FileExists_NoExceptions(ProjectName))
{
ProjectFullPath = new FileReference(ProjectName);
}
else
{
var Branch = new BranchInfo(new List<UnrealTargetPlatform> { UnrealBuildTool.BuildHostPlatform.Current.Platform });
var GameProj = Branch.FindGame(OriginalProjectName);
if (GameProj != null)
{
ProjectFullPath = GameProj.FilePath;
}
if (!FileExists_NoExceptions(ProjectFullPath.FullName))
{
throw new AutomationException("Could not find a project file {0}.", ProjectName);
}
}
}
return ProjectFullPath;
}
}
#endregion
}
}