using Unity.Burst.LowLevel; using UnityEditor; using Unity.Jobs.LowLevel.Unsafe; using UnityEngine; using System; namespace Unity.Burst.Editor { /// /// Register all menu entries for burst to the Editor /// internal static class BurstMenu { private const string EnableBurstCompilationText = "Jobs/Burst/Enable Compilation"; private const string EnableSafetyChecksTextOff = "Jobs/Burst/Safety Checks/Off"; private const string EnableSafetyChecksTextOn = "Jobs/Burst/Safety Checks/On"; private const string EnableSafetyChecksTextForceOn = "Jobs/Burst/Safety Checks/Force On"; private const string ForceSynchronousCompilesText = "Jobs/Burst/Synchronous Compilation"; private const string EnableDebugCompilationText = "Jobs/Burst/Native Debug Mode Compilation"; private const string ShowBurstTimingsText = "Jobs/Burst/Show Timings"; private const string BurstInspectorText = "Jobs/Burst/Open Inspector..."; // ---------------------------------------------------------------------------------------------- // #1 Enable Compilation // ---------------------------------------------------------------------------------------------- [MenuItem(EnableBurstCompilationText, false, 1)] private static void EnableBurstCompilation() { ChangeOptionSafely(() => BurstEditorOptions.EnableBurstCompilation = !BurstEditorOptions.EnableBurstCompilation); } [MenuItem(EnableBurstCompilationText, true, 1)] private static bool EnableBurstCompilationValidate() { Menu.SetChecked(EnableBurstCompilationText, BurstEditorOptions.EnableBurstCompilation); return BurstCompilerService.IsInitialized; } // ---------------------------------------------------------------------------------------------- // #2 Safety Checks // ---------------------------------------------------------------------------------------------- [MenuItem(EnableSafetyChecksTextOff, false, 1)] private static void EnableBurstSafetyChecksOff() { ChangeOptionSafely(() => { BurstEditorOptions.EnableBurstSafetyChecks = false; BurstEditorOptions.ForceEnableBurstSafetyChecks = false; }); Menu.SetChecked(EnableSafetyChecksTextOff, true); Menu.SetChecked(EnableSafetyChecksTextOn, false); Menu.SetChecked(EnableSafetyChecksTextForceOn, false); } [MenuItem(EnableSafetyChecksTextOff, true, 1)] private static bool EnableBurstSafetyChecksOffValidate() { Menu.SetChecked(EnableSafetyChecksTextOff, !BurstEditorOptions.EnableBurstSafetyChecks && !BurstEditorOptions.ForceEnableBurstSafetyChecks); return BurstCompilerService.IsInitialized && BurstEditorOptions.EnableBurstCompilation; } [MenuItem(EnableSafetyChecksTextOn, false, 2)] private static void EnableBurstSafetyChecksOn() { ChangeOptionSafely(() => { BurstEditorOptions.EnableBurstSafetyChecks = true; BurstEditorOptions.ForceEnableBurstSafetyChecks = false; }); Menu.SetChecked(EnableSafetyChecksTextOff, false); Menu.SetChecked(EnableSafetyChecksTextOn, true); Menu.SetChecked(EnableSafetyChecksTextForceOn, false); } [MenuItem(EnableSafetyChecksTextOn, true, 2)] private static bool EnableBurstSafetyChecksOnValidate() { Menu.SetChecked(EnableSafetyChecksTextOn, BurstEditorOptions.EnableBurstSafetyChecks && !BurstEditorOptions.ForceEnableBurstSafetyChecks); return BurstCompilerService.IsInitialized && BurstEditorOptions.EnableBurstCompilation; } [MenuItem(EnableSafetyChecksTextForceOn, false, 3)] private static void EnableBurstSafetyChecksForceOn() { ChangeOptionSafely(() => { BurstEditorOptions.EnableBurstSafetyChecks = true; BurstEditorOptions.ForceEnableBurstSafetyChecks = true; }); Menu.SetChecked(EnableSafetyChecksTextOff, false); Menu.SetChecked(EnableSafetyChecksTextOn, false); Menu.SetChecked(EnableSafetyChecksTextForceOn, true); } [MenuItem(EnableSafetyChecksTextForceOn, true, 3)] private static bool EnableBurstSafetyChecksForceOnValidate() { Menu.SetChecked(EnableSafetyChecksTextForceOn, BurstEditorOptions.ForceEnableBurstSafetyChecks); return BurstCompilerService.IsInitialized && BurstEditorOptions.EnableBurstCompilation; } // ---------------------------------------------------------------------------------------------- // #3 Synchronous Compilation // ---------------------------------------------------------------------------------------------- [MenuItem(ForceSynchronousCompilesText, false, 5)] private static void ForceSynchronousCompiles() { BurstEditorOptions.EnableBurstCompileSynchronously = !BurstEditorOptions.EnableBurstCompileSynchronously; } [MenuItem(ForceSynchronousCompilesText, true, 5)] private static bool ForceSynchronousCompilesValidate() { Menu.SetChecked(ForceSynchronousCompilesText, BurstEditorOptions.EnableBurstCompileSynchronously); return BurstCompilerService.IsInitialized && BurstEditorOptions.EnableBurstCompilation; } // ---------------------------------------------------------------------------------------------- // #4 Synchronous Compilation // ---------------------------------------------------------------------------------------------- [MenuItem(EnableDebugCompilationText, false, 6)] private static void EnableDebugMode() { ChangeOptionSafely(() => { BurstEditorOptions.EnableBurstDebug = !BurstEditorOptions.EnableBurstDebug; }); } [MenuItem(EnableDebugCompilationText, true, 6)] private static bool EnableDebugModeValidate() { Menu.SetChecked(EnableDebugCompilationText, BurstEditorOptions.EnableBurstDebug); return BurstCompilerService.IsInitialized && BurstEditorOptions.EnableBurstCompilation; } // ---------------------------------------------------------------------------------------------- // #5 Show Timings // ---------------------------------------------------------------------------------------------- [MenuItem(ShowBurstTimingsText, false, 7)] private static void ShowBurstTimings() { BurstEditorOptions.EnableBurstTimings = !BurstEditorOptions.EnableBurstTimings; } [MenuItem(ShowBurstTimingsText, true, 7)] private static bool ShowBurstTimingsValidate() { Menu.SetChecked(ShowBurstTimingsText, BurstEditorOptions.EnableBurstTimings); return BurstCompilerService.IsInitialized && BurstEditorOptions.EnableBurstCompilation; } // ---------------------------------------------------------------------------------------------- // #6 Open Inspector... // ---------------------------------------------------------------------------------------------- [MenuItem(BurstInspectorText, false, 8)] private static void BurstInspector() { // Get existing open window or if none, make a new one: BurstInspectorGUI window = EditorWindow.GetWindow("Burst Inspector"); window.Show(); } [MenuItem(BurstInspectorText, true, 8)] private static bool BurstInspectorValidate() { return BurstCompilerService.IsInitialized; } private static void ChangeOptionSafely(Action callback) { try { RequiresRestartUtility.CalledFromUI = true; callback(); if (RequiresRestartUtility.RequiresRestart) { EditorUtility.DisplayDialog( "Editor Restart Required", "This setting will not be applied until the Editor has been restarted. Please restart the Editor to continue.", "OK"); BurstCompiler.Shutdown(); } } finally { RequiresRestartUtility.RequiresRestart = false; RequiresRestartUtility.CalledFromUI = false; } } } }