#rb Phllip.Kavan
#jira UE-89057
#ROBOMERGE-SOURCE: CL 11522401 via CL 11522407 via CL 11522423
#ROBOMERGE-BOT: (v654-11333218)
[CL 11525131 by dan oconnor in Main branch]
Also includes -noshaderddc option for emulating a cold DDC for shaders only.
#rb na
#ROBOMERGE-OWNER: andrew.grant
#ROBOMERGE-AUTHOR: andrew.grant
#ROBOMERGE-SOURCE: CL 11519411 via CL 11519529 via CL 11519553
#ROBOMERGE-BOT: (v654-11333218)
[CL 11524747 by andrew grant in Main branch]
- Added a 60 seconds grace period for the Editor process to exit so that we can read its exit code.
#rb Francis.Hurteau
#lockdown cristina.riveron
#ROBOMERGE-OWNER: patrick.laflamme
#ROBOMERGE-AUTHOR: patrick.laflamme
#ROBOMERGE-SOURCE: CL 11507818 in //UE4/Release-4.24/... via CL 11508156 via CL 11508181
#ROBOMERGE-BOT: RELEASE (Release-4.25Plus -> Main) (v654-11333218)
[CL 11508901 by patrick laflamme in Main branch]
- Added a 60 seconds grace period for the Editor process to exit so that we can read its exit code.
#rb Francis.Hurteau
#lockdown cristina.riveron
#ROBOMERGE-OWNER: patrick.laflamme
#ROBOMERGE-AUTHOR: patrick.laflamme
#ROBOMERGE-SOURCE: CL 11507818 in //UE4/Release-4.24/... via CL 11508156
#ROBOMERGE-BOT: RELEASE (Release-4.25 -> Release-4.25Plus) (v654-11333218)
[CL 11508181 by patrick laflamme in 4.25-Plus branch]
#tests Android builds from AutoSDK can now be cleaned.
[FYI] chris.babcock
#ROBOMERGE-SOURCE: CL 11507176 via CL 11507199 via CL 11507207
#ROBOMERGE-BOT: (v654-11333218)
[CL 11507215 by andrew grant in Main branch]
#jira UE-89006
#ue4
#android
#rb Brandon.Schaefer
#ROBOMERGE-SOURCE: CL 11504731 in //UE4/Release-4.25/... via CL 11504758
#ROBOMERGE-BOT: RELEASE (Release-4.25Plus -> Main) (v654-11333218)
[CL 11504786 by chris babcock in Main branch]
## Summary
`UnrealTargetPlatform` and `UnrealPlatformGroup` are partial structs which each have a static member variable declared like this:
private static UniqueStringRegistry StringRegistry = new UniqueStringRegistry();
These partial structs have additional implementations in /Engine/Platforms/XXX/Source/Programs/UnrealBuildTool/UEBuildXXX.cs, which also have static member variables declared like this:
public static UnrealTargetPlatform XXX = FindOrAddByName("XXX");
`FindOrAddByName()` is a static method on `UnrealTargetPlatform` and `UnrealPlatformGroup` which accesses `StringRegistry` and requires it to be initialized i.e. non-null.
It appears that there's no guarantee in .NET runtime that the static member variables in the "original" implementation of the partial structs will be initialized _before_ the ones from the "additional" implementations. This means `XXX` above can be initialized in the additonal implementation before `StringRegistry` has been initialized in the original implementation, which means it's still null when `FindOrAddByName()` is called so the tool crashes.
In practice, this is 100% reproducible in our public GitHub mirror when opening `UnrealBuildTool.csproj` with VisualStudio Mac. This IDE rewrites the project file which affects when / how UEBuildXXX.cs is compiled, and static member variables for these partial structs end up being initialized out or order.
The only solution I found that worked was to replace all accesses to the `StringRegistry` static member variables by a wrapper function `GetUniqueStringRegistry()` which takes care of initializing it - only once. Since all this happens while the tool launches, this code should not need to be multithread aware / re-entrant.
NOTE: There is another partial struct `RestrictedFolder` in this codebase which also use `UniqueStringRegistry` in a similar way but the 2 implementations are in the same source file, so the bug may not happen and I left the implementation untouched.
## Test Plan
- Opened `UnrealBuildTool.csproj` with VisualStudio Mac
- Built UnrealBuildTool and verified it crashed on launch due to `StringRegistry` being NULL when used by `FindOrAddByName()`
- Confirmed the crash doesn't happen anymore after applying this change and that the `StringRegistry` static member variable was only set once by `GetUniqueStringRegistry()`
#jira UE-88908
#rb ben.marsh
#ROBOMERGE-SOURCE: CL 11498874 in //UE4/Release-4.25/... via CL 11498887
#ROBOMERGE-BOT: RELEASE (Release-4.25Plus -> Main) (v654-11333218)
[CL 11498906 by pierreolivier latour in Main branch]
## Summary
`UnrealTargetPlatform` and `UnrealPlatformGroup` are partial structs which each have a static member variable declared like this:
private static UniqueStringRegistry StringRegistry = new UniqueStringRegistry();
These partial structs have additional implementations in /Engine/Platforms/XXX/Source/Programs/UnrealBuildTool/UEBuildXXX.cs, which also have static member variables declared like this:
public static UnrealTargetPlatform XXX = FindOrAddByName("XXX");
`FindOrAddByName()` is a static method on `UnrealTargetPlatform` and `UnrealPlatformGroup` which accesses `StringRegistry` and requires it to be initialized i.e. non-null.
It appears that there's no guarantee in .NET runtime that the static member variables in the "original" implementation of the partial structs will be initialized _before_ the ones from the "additional" implementations. This means `XXX` above can be initialized in the additonal implementation before `StringRegistry` has been initialized in the original implementation, which means it's still null when `FindOrAddByName()` is called so the tool crashes.
In practice, this is 100% reproducible in our public GitHub mirror when opening `UnrealBuildTool.csproj` with VisualStudio Mac. This IDE rewrites the project file which affects when / how UEBuildXXX.cs is compiled, and static member variables for these partial structs end up being initialized out or order.
The only solution I found that worked was to replace all accesses to the `StringRegistry` static member variables by a wrapper function `GetUniqueStringRegistry()` which takes care of initializing it - only once. Since all this happens while the tool launches, this code should not need to be multithread aware / re-entrant.
NOTE: There is another partial struct `RestrictedFolder` in this codebase which also use `UniqueStringRegistry` in a similar way but the 2 implementations are in the same source file, so the bug may not happen and I left the implementation untouched.
## Test Plan
- Opened `UnrealBuildTool.csproj` with VisualStudio Mac
- Built UnrealBuildTool and verified it crashed on launch due to `StringRegistry` being NULL when used by `FindOrAddByName()`
- Confirmed the crash doesn't happen anymore after applying this change and that the `StringRegistry` static member variable was only set once by `GetUniqueStringRegistry()`
#jira UE-88908
#rb ben.marsh
#ROBOMERGE-SOURCE: CL 11498874 in //UE4/Release-4.25/...
#ROBOMERGE-BOT: RELEASE (Release-4.25 -> Release-4.25Plus) (v654-11333218)
[CL 11498887 by pierreolivier latour in 4.25-Plus branch]
#jira UE-88904
#rb ben.marsh
#ROBOMERGE-SOURCE: CL 11498406 via CL 11498420 via CL 11498430
#ROBOMERGE-BOT: (v654-11333218)
[CL 11498551 by rex hill in Main branch]
#jira UE-88744
#rb trivial
#rnx
#ROBOMERGE-SOURCE: CL 11493809 in //UE4/Release-4.25/... via CL 11493935
#ROBOMERGE-BOT: RELEASE (Release-4.25Plus -> Main) (v654-11333218)
[CL 11493973 by jack porter in Main branch]
#jira UE-88929
#ue4
#android
#rb Tyler.Quinn
#ROBOMERGE-SOURCE: CL 11467813 in //UE4/Release-4.25/... via CL 11467815
#ROBOMERGE-BOT: RELEASE (Release-4.25Plus -> Main) (v654-11333218)
[CL 11467820 by chris babcock in Main branch]
- Prevented CrashReportClient::FinalizeDiagnoseReportWorker() function to called after the CrashReportClient instance was deleted.
Details:
The FDiagnoseReportWorker asynchronous task created an extra asynchronous tasks (calling back CrashReportClient instance) that could fire after the targetted CrashReportClient instance was deleted. The solutions moves the logic to 'finilize' the report in the tick function that is expected to run in the game thread and make 'Close Without Sending' flows like 'Send and Close'/'Send and Restart' but without sending anything.
#rb Francis.Hurteau
#lockdown cristina.riveron
#ROBOMERGE-SOURCE: CL 11462889 in //UE4/Release-4.24/...
#ROBOMERGE-BOT: RELEASE (Release-4.24 -> Main) (v654-11333218)
[CL 11462901 by patrick laflamme in Main branch]
Fixing crash in 3ds Max Exporter, autodesk noise map are not supported.
#jira UE-88193
Julien.StJean
#rb Julien.StJean
#ROBOMERGE-SOURCE: CL 11462019 in //UE4/Release-4.25/... via CL 11462031
#ROBOMERGE-BOT: RELEASE (Release-4.25Plus -> Main) (v654-11333218)
[CL 11462473 by benoit deschenes in Main branch]
#rb none
#rnx
#jira UE-88874
#ROBOMERGE-SOURCE: CL 11461845 in //UE4/Release-4.25/... via CL 11461851
#ROBOMERGE-BOT: RELEASE (Release-4.25Plus -> Main) (v654-11333218)
[CL 11462438 by ben marsh in Main branch]
Integrated from Dev-Enterprise (CL 11194428)
#jira UE-87522
#rb JeanLuc.Corenthin, David.Lesage
#ROBOMERGE-SOURCE: CL 11459071 in //UE4/Release-4.25/... via CL 11459072
#ROBOMERGE-BOT: RELEASE (Release-4.25Plus -> Main) (v654-11333218)
[CL 11462225 by emil kirichev in Main branch]
- This prevents an error being displayed in the log before staging.
[at]jack.porter
#jira UE-86335
#rb jack.porter
#ROBOMERGE-SOURCE: CL 11458335 in //UE4/Release-4.25/... via CL 11458336
#ROBOMERGE-BOT: RELEASE (Release-4.25Plus -> Main) (v654-11333218)
[CL 11462163 by anthony bills in Main branch]