static BurstLoader() { // This can be setup to get more diagnostics var debuggingStr = Environment.GetEnvironmentVariable("UNITY_BURST_DEBUG"); IsDebugging = debuggingStr != null; if (IsDebugging) { UnityEngine.Debug.LogWarning("[com.unity.burst] Extra debugging is turned on."); int debuggingLevel; int.TryParse(debuggingStr, out debuggingLevel); if (debuggingLevel <= 0) { debuggingLevel = 1; } DebuggingLevel = debuggingLevel; } // Try to load the runtime through an environment variable RuntimePath = Environment.GetEnvironmentVariable("UNITY_BURST_RUNTIME_PATH"); // Otherwise try to load it from the package itself if (!Directory.Exists(RuntimePath)) { RuntimePath = Path.GetFullPath("Packages/com.unity.burst/.Runtime"); } if (IsDebugging) { UnityEngine.Debug.LogWarning($"[com.unity.burst] Runtime directory set to {RuntimePath}"); } BurstEditorOptions.EnsureSynchronized(); if (DebuggingLevel > 2) { UnityEngine.Debug.Log("Burst - Domain Reload"); } BurstCompilerService.Initialize(RuntimePath, TryGetOptionsFromMember); EditorApplication.quitting += BurstCompiler.Shutdown; CompilationPipeline.assemblyCompilationStarted += OnAssemblyCompilationStarted; CompilationPipeline.assemblyCompilationFinished += OnAssemblyCompilationFinished; EditorApplication.playModeStateChanged += EditorApplicationOnPlayModeStateChanged; }
static BurstLoader() { // Un-comment the following to log compilation steps to log.txt in the .Runtime folder // Environment.SetEnvironmentVariable("UNITY_BURST_DEBUG", "1"); // Try to load the runtime through an environment variable RuntimePath = Environment.GetEnvironmentVariable("UNITY_BURST_RUNTIME_PATH"); // Otherwise try to load it from the package itself if (!Directory.Exists(RuntimePath)) { RuntimePath = Path.GetFullPath("Packages/com.unity.burst/.Runtime"); } BurstEditorOptions.EnsureSynchronized(); BurstCompilerService.Initialize(RuntimePath, TryGetOptionsFromMember); }
static BurstLoader() { // This can be setup to get more diagnostics IsDebugging = Environment.GetEnvironmentVariable("UNITY_BURST_DEBUG") != null; // Try to load the runtime through an environment variable RuntimePath = Environment.GetEnvironmentVariable("UNITY_BURST_RUNTIME_PATH"); // Otherwise try to load it from the package itself if (!Directory.Exists(RuntimePath)) { RuntimePath = Path.GetFullPath("Packages/com.unity.burst/.Runtime"); } BurstEditorOptions.EnsureSynchronized(); BurstCompilerService.Initialize(RuntimePath, TryGetOptionsFromMember); EditorApplication.quitting += BurstCompiler.Shutdown; }
public void OnGUI() { if (!_initialized) { GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); GUILayout.BeginVertical(); GUILayout.FlexibleSpace(); GUILayout.Label("Loading..."); GUILayout.FlexibleSpace(); GUILayout.EndVertical(); GUILayout.FlexibleSpace(); GUILayout.EndHorizontal(); return; } // Make sure that editor options are synchronized BurstEditorOptions.EnsureSynchronized(); if (_fontSizesText == null) { _fontSizesText = new string[FontSizes.Length]; for (var i = 0; i < FontSizes.Length; ++i) { _fontSizesText[i] = FontSizes[i].ToString(); } } if (_fontSizeIndex == -1) { _fontSizeIndex = EditorPrefs.GetInt(FontSizeIndexPref, 5); _fontSizeIndex = Math.Max(0, _fontSizeIndex); _fontSizeIndex = Math.Min(_fontSizeIndex, FontSizes.Length - 1); } if (_fixedFontStyle == null) { _fixedFontStyle = new GUIStyle(GUI.skin.label); string fontName; if (Application.platform == RuntimePlatform.WindowsEditor) { fontName = "Consolas"; } else { fontName = "Courier"; } CleanupFont(); _font = Font.CreateDynamicFontFromOSFont(fontName, FontSize); _fixedFontStyle.font = _font; _fixedFontStyle.fontSize = FontSize; } if (_searchField == null) { _searchField = new SearchField(); } if (_textArea == null) { _textArea = new LongTextArea(); } GUILayout.BeginHorizontal(); // SplitterGUILayout.BeginHorizontalSplit is internal in Unity but we don't have much choice SplitterGUILayout.BeginHorizontalSplit(TreeViewSplitterState); GUILayout.BeginVertical(GUILayout.Width(position.width / 3)); GUILayout.Label("Compile Targets", EditorStyles.boldLabel); var newFilter = _searchField.OnGUI(_treeView.Filter); if (newFilter != _treeView.Filter) { _treeView.Filter = newFilter; _treeView.Reload(); } _treeView.OnGUI(GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true))); GUILayout.EndVertical(); GUILayout.BeginVertical(); var selection = _treeView.GetSelection(); if (selection.Count == 1) { var targetIndex = selection[0]; var target = _targets[targetIndex - 1]; var targetOptions = target.Options; // Stash selected item name to handle domain reloads more gracefully _selectedItem = target.GetDisplayName(); if (_assemblyKind == -1) { if (_enhancedDisassembly) { _assemblyKind = (int)AssemblyKind.ColouredMinimalDebugInformation; } else { _assemblyKind = (int)AssemblyKind.RawNoDebugInformation; } } // Refresh if any options are changed bool doCopy; int fontSize; // -14 to add a little bit of space for the vertical scrollbar to display correctly RenderButtonBars((position.width * 2) / 3 - 14, target, out doCopy, out fontSize); // We are currently formatting only Asm output var isTextFormatted = IsEnhanced((AssemblyKind)_assemblyKind) && _disasmKind == DisassemblyKind.Asm; // Depending if we are formatted or not, we don't render the same text var textToRender = isTextFormatted ? target.FormattedDisassembly : target.RawDisassembly; // Only refresh if we are switching to a new selection that hasn't been disassembled yet // Or we are changing disassembly settings (safety checks / enhanced disassembly) var targetRefresh = textToRender == null || target.DisassemblyKind != _disasmKind || targetOptions.EnableBurstSafetyChecks != _safetyChecks || target.TargetCpu != _targetCpu || target.IsDarkMode != EditorGUIUtility.isProSkin; bool targetChanged = _previousTargetIndex != targetIndex; _previousTargetIndex = targetIndex; if (_assemblyKindPrior != _assemblyKind) { targetRefresh = true; _assemblyKindPrior = _assemblyKind; // Needs to be refreshed, as we need to change disassembly options // If the target did not changed but our assembly kind did, we need to remember this. if (!targetChanged) { _sameTargetButDifferentAssemblyKind = true; } } // If the previous target changed the assembly kind and we have a target change, we need to // refresh the assembly because we'll have cached the previous assembly kinds output rather // than the one requested. if (_sameTargetButDifferentAssemblyKind && targetChanged) { targetRefresh = true; _sameTargetButDifferentAssemblyKind = false; } if (targetRefresh) { // TODO: refactor this code with a proper AppendOption to avoid these "\n" var options = new StringBuilder(); target.TargetCpu = _targetCpu; target.DisassemblyKind = _disasmKind; targetOptions.EnableBurstSafetyChecks = _safetyChecks; target.IsDarkMode = EditorGUIUtility.isProSkin; targetOptions.EnableBurstCompileSynchronously = true; string defaultOptions; if (targetOptions.TryGetOptions(target.IsStaticMethod ? (MemberInfo)target.Method : target.JobType, true, out defaultOptions)) { options.Append(defaultOptions); options.AppendFormat("\n" + BurstCompilerOptions.GetOption(BurstCompilerOptions.OptionTarget, TargetCpuNames[(int)_targetCpu])); switch ((AssemblyKind)_assemblyKind) { case AssemblyKind.EnhancedMinimalDebugInformation: case AssemblyKind.ColouredMinimalDebugInformation: options.AppendFormat("\n" + BurstCompilerOptions.GetOption(BurstCompilerOptions.OptionDebug, "2")); break; case AssemblyKind.ColouredFullDebugInformation: case AssemblyKind.EnhancedFullDebugInformation: case AssemblyKind.RawWithDebugInformation: options.AppendFormat("\n" + BurstCompilerOptions.GetOption(BurstCompilerOptions.OptionDebug, "1")); break; default: case AssemblyKind.RawNoDebugInformation: break; } var baseOptions = options.ToString().Trim('\n', ' '); target.RawDisassembly = GetDisassembly(target.Method, baseOptions + DisasmOptions[(int)_disasmKind]); if (isTextFormatted) { target.FormattedDisassembly = _burstDisassembler.Process(target.RawDisassembly, FetchAsmKind(_targetCpu), target.IsDarkMode, IsColoured((AssemblyKind)_assemblyKind)); textToRender = target.FormattedDisassembly; } else { target.FormattedDisassembly = null; textToRender = target.RawDisassembly; } } } if (textToRender != null) { _textArea.Text = textToRender; if (targetChanged) { _scrollPos = Vector2.zero; } _scrollPos = GUILayout.BeginScrollView(_scrollPos, true, true); _textArea.Render(_fixedFontStyle); GUILayout.EndScrollView(); } if (doCopy) { // When copying to the clipboard, we copy the version the user sees EditorGUIUtility.systemCopyBuffer = textToRender ?? string.Empty; } if (fontSize != _fontSizeIndex) { _fontSizeIndex = fontSize; EditorPrefs.SetInt(FontSizeIndexPref, fontSize); _fixedFontStyle = null; } } GUILayout.EndVertical(); SplitterGUILayout.EndHorizontalSplit(); GUILayout.EndHorizontal(); }
public void OnGUI() { // Make sure that editor options are synchronized BurstEditorOptions.EnsureSynchronized(); if (_targets == null) { _targets = BurstReflection.FindExecuteMethods(AssembliesType.Editor); foreach (var target in _targets) { // Enable burst compilation by default (override globals for the inspector) // This is not working as expected. This changes indirectly the global options while it shouldn't // Unable to explain how it can happen // so for now, if global enable burst compilation is disabled, then inspector is too //target.Options.EnableBurstCompilation = true; } // Order targets per name _targets.Sort((left, right) => string.Compare(left.GetDisplayName(), right.GetDisplayName(), StringComparison.Ordinal)); _treeView.Targets = _targets; _treeView.Reload(); if (_selectedItem != null) { _treeView.TrySelectByDisplayName(_selectedItem); } } if (_fontSizesText == null) { _fontSizesText = new string[FontSizes.Length]; for (var i = 0; i < FontSizes.Length; ++i) { _fontSizesText[i] = FontSizes[i].ToString(); } } if (_fontSizeIndex == -1) { _fontSizeIndex = EditorPrefs.GetInt(FontSizeIndexPref, 5); _fontSizeIndex = Math.Max(0, _fontSizeIndex); _fontSizeIndex = Math.Min(_fontSizeIndex, FontSizes.Length - 1); } if (_fixedFontStyle == null) { _fixedFontStyle = new GUIStyle(GUI.skin.label); string fontName; if (Application.platform == RuntimePlatform.WindowsEditor) { fontName = "Consolas"; } else { fontName = "Courier"; } CleanupFont(); _font = Font.CreateDynamicFontFromOSFont(fontName, FontSize); _fixedFontStyle.font = _font; _fixedFontStyle.fontSize = FontSize; } if (_searchField == null) { _searchField = new SearchField(); } if (_textArea == null) { _textArea = new LongTextArea(); } GUILayout.BeginHorizontal(); GUILayout.BeginVertical(GUILayout.Width(position.width / 3)); GUILayout.Label("Compile Targets", EditorStyles.boldLabel); var newFilter = _searchField.OnGUI(_treeView.Filter); if (newFilter != _treeView.Filter) { _treeView.Filter = newFilter; _treeView.Reload(); } _treeView.OnGUI(GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true))); GUILayout.EndVertical(); GUILayout.BeginVertical(); var selection = _treeView.GetSelection(); if (selection.Count == 1) { var id = selection[0]; var target = _targets[id - 1]; // Stash selected item name to handle domain reloads more gracefully _selectedItem = target.GetDisplayName(); bool doRefresh = false; bool doCopy = false; int fsi = _fontSizeIndex; RenderButtonBars((position.width * 2) / 3, target, out doRefresh, out doCopy, out fsi); var disasm = target.Disassembly != null ? target.Disassembly[(int)_disasmKind] : null; var methodOptions = target.Options.Clone(); if (doRefresh) { // TODO: refactor this code with a proper AppendOption to avoid these "\n" var options = new StringBuilder(); methodOptions.EnableBurstSafetyChecks = _safetyChecks; methodOptions.EnableEnhancedAssembly = _enhancedDisassembly; methodOptions.DisableOptimizations = !_optimizations; methodOptions.EnableFastMath = _fastMath; // force synchronouze compilation for the inspector methodOptions.EnableBurstCompileSynchronously = true; string defaultOptions; bool debug; // We still show disassembly even if method has [BurstCompile(Debug = true)] if (methodOptions.TryGetOptions(target.IsStaticMethod ? (MemberInfo)target.Method : target.JobType, true, out defaultOptions, out debug)) { options.Append(defaultOptions); options.AppendFormat("\n" + BurstCompilerOptions.GetOption(BurstCompilerOptions.OptionTarget, CodeGenOptions[_codeGenOptions])); var baseOptions = options.ToString().Trim('\n', ' '); target.Disassembly = new string[DisasmOptions.Length]; for (var i = 0; i < DisasmOptions.Length; ++i) { target.Disassembly[i] = GetDisassembly(target.Method, baseOptions + DisasmOptions[i]); } if (_enhancedDisassembly && (int)DisassemblyKind.Asm < target.Disassembly.Length) { var processor = new BurstDisassembler(); target.Disassembly[(int)DisassemblyKind.Asm] = processor.Process(target.Disassembly[(int)DisassemblyKind.Asm]); } disasm = target.Disassembly[(int)_disasmKind]; } } if (disasm != null) { _textArea.Text = disasm; _scrollPos = GUILayout.BeginScrollView(_scrollPos); _textArea.Render(_fixedFontStyle); GUILayout.EndScrollView(); } if (doCopy) { EditorGUIUtility.systemCopyBuffer = disasm == null ? "" : disasm; } if (fsi != _fontSizeIndex) { _fontSizeIndex = fsi; EditorPrefs.SetInt(FontSizeIndexPref, fsi); _fixedFontStyle = null; } } GUILayout.EndVertical(); GUILayout.EndHorizontal(); }
static BurstLoader() { if (BurstCompilerOptions.ForceDisableBurstCompilation) { UnityEngine.Debug.LogWarning("[com.unity.burst] Burst is disabled entirely from the command line"); return; } // This can be setup to get more diagnostics var debuggingStr = Environment.GetEnvironmentVariable("UNITY_BURST_DEBUG"); IsDebugging = debuggingStr != null; if (IsDebugging) { UnityEngine.Debug.LogWarning("[com.unity.burst] Extra debugging is turned on."); int debuggingLevel; int.TryParse(debuggingStr, out debuggingLevel); if (debuggingLevel <= 0) { debuggingLevel = 1; } DebuggingLevel = debuggingLevel; } // Try to load the runtime through an environment variable RuntimePath = Environment.GetEnvironmentVariable("UNITY_BURST_RUNTIME_PATH"); // Otherwise try to load it from the package itself if (!Directory.Exists(RuntimePath)) { RuntimePath = Path.GetFullPath("Packages/com.unity.burst/.Runtime"); } if (IsDebugging) { UnityEngine.Debug.LogWarning($"[com.unity.burst] Runtime directory set to {RuntimePath}"); } BurstEditorOptions.EnsureSynchronized(); BurstCompilerService.Initialize(RuntimePath, TryGetOptionsFromMemberDelegate); EditorApplication.quitting += BurstCompiler.Shutdown; CompilationPipeline.assemblyCompilationStarted += OnAssemblyCompilationStarted; CompilationPipeline.assemblyCompilationFinished += OnAssemblyCompilationFinished; EditorApplication.playModeStateChanged += EditorApplicationOnPlayModeStateChanged; VersionUpdateCheck(); // Workaround to update the list of assembly folders as soon as possible // in order for the JitCompilerService to not fail with AssemblyResolveExceptions. try { var assemblyList = BurstReflection.GetAssemblyList(AssembliesType.Editor); var assemblyFolders = new HashSet <string>(); foreach (var assembly in assemblyList) { try { var fullPath = Path.GetFullPath(assembly.Location); var assemblyFolder = Path.GetDirectoryName(fullPath); if (!string.IsNullOrEmpty(assemblyFolder)) { assemblyFolders.Add(assemblyFolder); } } catch { // ignore } } // Notify the compiler var assemblyFolderList = assemblyFolders.ToList(); if (IsDebugging) { UnityEngine.Debug.Log($"Burst - Change of list of assembly folders:\n{string.Join("\n", assemblyFolderList)}"); } BurstCompiler.UpdateAssemblerFolders(assemblyFolderList); } catch { // ignore } // Notify the compiler about a domain reload if (IsDebugging) { UnityEngine.Debug.Log("Burst - Domain Reload"); } // Notify the JitCompilerService about a domain reload BurstCompiler.DomainReload(); // Make sure that the X86 CSR function pointers are compiled Intrinsics.X86.CompileManagedCsrAccessors(); // Make sure BurstRuntime is initialized BurstRuntime.Initialize(); }
public void OnGUI() { // Make sure that editor options are synchronized BurstEditorOptions.EnsureSynchronized(); if (_targets == null) { _targets = BurstReflection.FindExecuteMethods(AssembliesType.Editor); foreach (var target in _targets) { // Enable burst compilation by default (override globals for the inspector) // This is not working as expected. This changes indirectly the global options while it shouldn't // Unable to explain how it can happen // so for now, if global enable burst compilation is disabled, then inspector is too //target.Options.EnableBurstCompilation = true; } // Order targets per name _targets.Sort((left, right) => string.Compare(left.GetDisplayName(), right.GetDisplayName(), StringComparison.Ordinal)); _treeView.Targets = _targets; _treeView.Reload(); if (_selectedItem != null) { _treeView.TrySelectByDisplayName(_selectedItem); } } if (_fontSizesText == null) { _fontSizesText = new string[FontSizes.Length]; for (var i = 0; i < FontSizes.Length; ++i) { _fontSizesText[i] = FontSizes[i].ToString(); } } if (_fontSizeIndex == -1) { _fontSizeIndex = EditorPrefs.GetInt(FontSizeIndexPref, 5); _fontSizeIndex = Math.Max(0, _fontSizeIndex); _fontSizeIndex = Math.Min(_fontSizeIndex, FontSizes.Length - 1); } if (_fixedFontStyle == null) { _fixedFontStyle = new GUIStyle(GUI.skin.label); string fontName; if (Application.platform == RuntimePlatform.WindowsEditor) { fontName = "Consolas"; } else { fontName = "Courier"; } CleanupFont(); _font = Font.CreateDynamicFontFromOSFont(fontName, FontSize); _fixedFontStyle.font = _font; _fixedFontStyle.fontSize = FontSize; } if (_searchField == null) { _searchField = new SearchField(); } if (_textArea == null) { _textArea = new LongTextArea(); } GUILayout.BeginHorizontal(); // SplitterGUILayout.BeginHorizontalSplit is internal in Unity but we don't have much choice SplitterGUILayout.BeginHorizontalSplit(TreeViewSplitterState); GUILayout.BeginVertical(GUILayout.Width(position.width / 3)); GUILayout.Label("Compile Targets", EditorStyles.boldLabel); var newFilter = _searchField.OnGUI(_treeView.Filter); if (newFilter != _treeView.Filter) { _treeView.Filter = newFilter; _treeView.Reload(); } _treeView.OnGUI(GUILayoutUtility.GetRect(GUIContent.none, GUIStyle.none, GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true))); GUILayout.EndVertical(); GUILayout.BeginVertical(); var selection = _treeView.GetSelection(); if (selection.Count == 1) { var targetIndex = selection[0]; var target = _targets[targetIndex - 1]; var targetOptions = target.Options; // Stash selected item name to handle domain reloads more gracefully _selectedItem = target.GetDisplayName(); // Refresh if any options are changed bool doCopy; int fontSize; // -14 to add a little bit of space for the vertical scrollbar to display correctly RenderButtonBars((position.width * 2) / 3 - 14, target, out doCopy, out fontSize); // We are currently formatting only Asm output var isTextFormatted = _enhancedDisassembly && _disasmKind == DisassemblyKind.Asm; // Depending if we are formatted or not, we don't render the same text var textToRender = isTextFormatted ? target.FormattedDisassembly : target.RawDisassembly; // Only refresh if we are switching to a new selection that hasn't been disassembled yet // Or we are changing disassembly settings (safety checks / enhanced disassembly) var targetRefresh = textToRender == null || target.DisassemblyKind != _disasmKind || targetOptions.EnableBurstSafetyChecks != _safetyChecks || target.TargetCpu != _targetCpu || target.IsDarkMode != EditorGUIUtility.isProSkin; bool targetChanged = _previousTargetIndex != targetIndex; _previousTargetIndex = targetIndex; if (targetRefresh) { // TODO: refactor this code with a proper AppendOption to avoid these "\n" var options = new StringBuilder(); target.TargetCpu = _targetCpu; target.DisassemblyKind = _disasmKind; targetOptions.EnableBurstSafetyChecks = _safetyChecks; target.IsDarkMode = EditorGUIUtility.isProSkin; targetOptions.EnableBurstCompileSynchronously = true; string defaultOptions; if (targetOptions.TryGetOptions(target.IsStaticMethod ? (MemberInfo)target.Method : target.JobType, true, out defaultOptions)) { options.Append(defaultOptions); options.AppendFormat("\n" + BurstCompilerOptions.GetOption(BurstCompilerOptions.OptionTarget, TargetCpuNames[(int)_targetCpu])); options.AppendFormat("\n" + BurstCompilerOptions.GetOption(BurstCompilerOptions.OptionDebug)); var baseOptions = options.ToString().Trim('\n', ' '); target.RawDisassembly = GetDisassembly(target.Method, baseOptions + DisasmOptions[(int)_disasmKind]); if (isTextFormatted) { // Store the formatted version target.FormattedDisassembly = _burstDisassembler.Process(target.RawDisassembly, IsIntel(_targetCpu) ? BurstDisassembler.AsmKind.Intel : BurstDisassembler.AsmKind.ARM, target.IsDarkMode); textToRender = target.FormattedDisassembly; } else { target.FormattedDisassembly = null; textToRender = target.RawDisassembly; } } } if (textToRender != null) { _textArea.Text = textToRender; if (targetChanged) { _scrollPos = Vector2.zero; } _scrollPos = GUILayout.BeginScrollView(_scrollPos, true, true); _textArea.Render(_fixedFontStyle); GUILayout.EndScrollView(); } if (doCopy) { // When copying to the clipboard, we copy the non-formatted version EditorGUIUtility.systemCopyBuffer = target.RawDisassembly ?? string.Empty; } if (fontSize != _fontSizeIndex) { _fontSizeIndex = fontSize; EditorPrefs.SetInt(FontSizeIndexPref, fontSize); _fixedFontStyle = null; } } GUILayout.EndVertical(); SplitterGUILayout.EndHorizontalSplit(); GUILayout.EndHorizontal(); }
static BurstLoader() { if (BurstCompilerOptions.ForceDisableBurstCompilation) { UnityEngine.Debug.LogWarning("[com.unity.burst] Burst is disabled entirely from the command line"); return; } // This can be setup to get more diagnostics var debuggingStr = Environment.GetEnvironmentVariable("UNITY_BURST_DEBUG"); IsDebugging = debuggingStr != null; if (IsDebugging) { UnityEngine.Debug.LogWarning("[com.unity.burst] Extra debugging is turned on."); int debuggingLevel; int.TryParse(debuggingStr, out debuggingLevel); if (debuggingLevel <= 0) { debuggingLevel = 1; } DebuggingLevel = debuggingLevel; } // Try to load the runtime through an environment variable if (!UnityBurstRuntimePathOverwritten(out var path)) { // Otherwise try to load it from the package itself path = Path.GetFullPath("Packages/com.unity.burst/.Runtime"); } RuntimePath = path; if (IsDebugging) { UnityEngine.Debug.LogWarning($"[com.unity.burst] Runtime directory set to {RuntimePath}"); } BurstCompilerService.Initialize(RuntimePath, TryGetOptionsFromMemberDelegate); // It's important that this call comes *after* BurstCompilerService.Initialize, // otherwise any calls from within EnsureSynchronized to BurstCompilerService, // such as BurstCompiler.Disable(), will silently fail. BurstEditorOptions.EnsureSynchronized(); EditorApplication.quitting += OnEditorApplicationQuitting; #if UNITY_2019_1_OR_NEWER CompilationPipeline.compilationStarted += OnCompilationStarted; #endif CompilationPipeline.assemblyCompilationStarted += OnAssemblyCompilationStarted; CompilationPipeline.assemblyCompilationFinished += OnAssemblyCompilationFinished; EditorApplication.playModeStateChanged += EditorApplicationOnPlayModeStateChanged; AppDomain.CurrentDomain.DomainUnload += OnDomainUnload; VersionUpdateCheck(); BurstReflection.EnsureInitialized(); #if !UNITY_2019_3_OR_NEWER // Workaround to update the list of assembly folders as soon as possible // in order for the JitCompilerService to not fail with AssemblyResolveExceptions. // This workaround is only necessary for editors prior to 2019.3 (i.e. 2018.4), // because 2019.3+ include a fix on the Unity side. try { var assemblyList = BurstReflection.AllEditorAssemblies; var assemblyFolders = new HashSet <string>(); foreach (var assembly in assemblyList) { try { var fullPath = Path.GetFullPath(assembly.Location); var assemblyFolder = Path.GetDirectoryName(fullPath); if (!string.IsNullOrEmpty(assemblyFolder)) { assemblyFolders.Add(assemblyFolder); } } catch { // ignore } } // Notify the compiler var assemblyFolderList = assemblyFolders.ToList(); if (IsDebugging) { UnityEngine.Debug.Log($"Burst - Change of list of assembly folders:\n{string.Join("\n", assemblyFolderList)}"); } BurstCompiler.UpdateAssemblerFolders(assemblyFolderList); } catch { // ignore } #endif // Notify the compiler about a domain reload if (IsDebugging) { UnityEngine.Debug.Log("Burst - Domain Reload"); } // Notify the JitCompilerService about a domain reload BurstCompiler.DomainReload(); #if UNITY_2020_1_OR_NEWER BurstCompiler.OnProgress += OnProgress; BurstCompiler.SetProgressCallback(); #endif #if !BURST_INTERNAL && !UNITY_DOTSPLAYER // Make sure that the X86 CSR function pointers are compiled Intrinsics.X86.CompileManagedCsrAccessors(); #endif // Make sure BurstRuntime is initialized BurstRuntime.Initialize(); // Schedule upfront compilation of all methods in all assemblies, // with the goal of having as many methods as possible Burst-compiled // by the time the user enters PlayMode. if (!EditorApplication.isPlayingOrWillChangePlaymode) { MaybeTriggerEagerCompilation(); } #if UNITY_2020_1_OR_NEWER // Can't call Menu.AddMenuItem immediately, presumably because the menu controller isn't initialized yet. EditorApplication.CallDelayed(() => CreateDynamicMenuItems()); #endif }