A game about forced loneliness, made by TACStudios
1using Unity.Burst.LowLevel;
2using UnityEditor;
3using Unity.Jobs.LowLevel.Unsafe;
4using UnityEngine;
5using System;
6
7namespace Unity.Burst.Editor
8{
9 /// <summary>
10 /// Register all menu entries for burst to the Editor
11 /// </summary>
12 internal static class BurstMenu
13 {
14 private const string EnableBurstCompilationText = "Jobs/Burst/Enable Compilation";
15 private const string EnableSafetyChecksTextOff = "Jobs/Burst/Safety Checks/Off";
16 private const string EnableSafetyChecksTextOn = "Jobs/Burst/Safety Checks/On";
17 private const string EnableSafetyChecksTextForceOn = "Jobs/Burst/Safety Checks/Force On";
18 private const string ForceSynchronousCompilesText = "Jobs/Burst/Synchronous Compilation";
19 private const string EnableDebugCompilationText = "Jobs/Burst/Native Debug Mode Compilation";
20 private const string ShowBurstTimingsText = "Jobs/Burst/Show Timings";
21 private const string BurstInspectorText = "Jobs/Burst/Open Inspector...";
22
23 // ----------------------------------------------------------------------------------------------
24 // #1 Enable Compilation
25 // ----------------------------------------------------------------------------------------------
26 [MenuItem(EnableBurstCompilationText, false, 1)]
27 private static void EnableBurstCompilation()
28 {
29 ChangeOptionSafely(() => BurstEditorOptions.EnableBurstCompilation = !BurstEditorOptions.EnableBurstCompilation);
30 }
31
32 [MenuItem(EnableBurstCompilationText, true, 1)]
33 private static bool EnableBurstCompilationValidate()
34 {
35 Menu.SetChecked(EnableBurstCompilationText, BurstEditorOptions.EnableBurstCompilation);
36 return BurstCompilerService.IsInitialized;
37 }
38
39 // ----------------------------------------------------------------------------------------------
40 // #2 Safety Checks
41 // ----------------------------------------------------------------------------------------------
42 [MenuItem(EnableSafetyChecksTextOff, false, 1)]
43 private static void EnableBurstSafetyChecksOff()
44 {
45 ChangeOptionSafely(() =>
46 {
47 BurstEditorOptions.EnableBurstSafetyChecks = false;
48 BurstEditorOptions.ForceEnableBurstSafetyChecks = false;
49 });
50 Menu.SetChecked(EnableSafetyChecksTextOff, true);
51 Menu.SetChecked(EnableSafetyChecksTextOn, false);
52 Menu.SetChecked(EnableSafetyChecksTextForceOn, false);
53 }
54
55 [MenuItem(EnableSafetyChecksTextOff, true, 1)]
56 private static bool EnableBurstSafetyChecksOffValidate()
57 {
58 Menu.SetChecked(EnableSafetyChecksTextOff, !BurstEditorOptions.EnableBurstSafetyChecks && !BurstEditorOptions.ForceEnableBurstSafetyChecks);
59 return BurstCompilerService.IsInitialized && BurstEditorOptions.EnableBurstCompilation;
60 }
61
62 [MenuItem(EnableSafetyChecksTextOn, false, 2)]
63 private static void EnableBurstSafetyChecksOn()
64 {
65 ChangeOptionSafely(() =>
66 {
67 BurstEditorOptions.EnableBurstSafetyChecks = true;
68 BurstEditorOptions.ForceEnableBurstSafetyChecks = false;
69 });
70 Menu.SetChecked(EnableSafetyChecksTextOff, false);
71 Menu.SetChecked(EnableSafetyChecksTextOn, true);
72 Menu.SetChecked(EnableSafetyChecksTextForceOn, false);
73 }
74
75 [MenuItem(EnableSafetyChecksTextOn, true, 2)]
76 private static bool EnableBurstSafetyChecksOnValidate()
77 {
78 Menu.SetChecked(EnableSafetyChecksTextOn, BurstEditorOptions.EnableBurstSafetyChecks && !BurstEditorOptions.ForceEnableBurstSafetyChecks);
79 return BurstCompilerService.IsInitialized && BurstEditorOptions.EnableBurstCompilation;
80 }
81
82 [MenuItem(EnableSafetyChecksTextForceOn, false, 3)]
83 private static void EnableBurstSafetyChecksForceOn()
84 {
85 ChangeOptionSafely(() =>
86 {
87 BurstEditorOptions.EnableBurstSafetyChecks = true;
88 BurstEditorOptions.ForceEnableBurstSafetyChecks = true;
89 });
90 Menu.SetChecked(EnableSafetyChecksTextOff, false);
91 Menu.SetChecked(EnableSafetyChecksTextOn, false);
92 Menu.SetChecked(EnableSafetyChecksTextForceOn, true);
93 }
94
95 [MenuItem(EnableSafetyChecksTextForceOn, true, 3)]
96 private static bool EnableBurstSafetyChecksForceOnValidate()
97 {
98 Menu.SetChecked(EnableSafetyChecksTextForceOn, BurstEditorOptions.ForceEnableBurstSafetyChecks);
99 return BurstCompilerService.IsInitialized && BurstEditorOptions.EnableBurstCompilation;
100 }
101
102 // ----------------------------------------------------------------------------------------------
103 // #3 Synchronous Compilation
104 // ----------------------------------------------------------------------------------------------
105 [MenuItem(ForceSynchronousCompilesText, false, 5)]
106 private static void ForceSynchronousCompiles()
107 {
108 BurstEditorOptions.EnableBurstCompileSynchronously = !BurstEditorOptions.EnableBurstCompileSynchronously;
109 }
110
111 [MenuItem(ForceSynchronousCompilesText, true, 5)]
112 private static bool ForceSynchronousCompilesValidate()
113 {
114 Menu.SetChecked(ForceSynchronousCompilesText, BurstEditorOptions.EnableBurstCompileSynchronously);
115 return BurstCompilerService.IsInitialized && BurstEditorOptions.EnableBurstCompilation;
116 }
117
118 // ----------------------------------------------------------------------------------------------
119 // #4 Synchronous Compilation
120 // ----------------------------------------------------------------------------------------------
121 [MenuItem(EnableDebugCompilationText, false, 6)]
122 private static void EnableDebugMode()
123 {
124 ChangeOptionSafely(() =>
125 {
126 BurstEditorOptions.EnableBurstDebug = !BurstEditorOptions.EnableBurstDebug;
127 });
128 }
129
130 [MenuItem(EnableDebugCompilationText, true, 6)]
131 private static bool EnableDebugModeValidate()
132 {
133 Menu.SetChecked(EnableDebugCompilationText, BurstEditorOptions.EnableBurstDebug);
134 return BurstCompilerService.IsInitialized && BurstEditorOptions.EnableBurstCompilation;
135 }
136
137 // ----------------------------------------------------------------------------------------------
138 // #5 Show Timings
139 // ----------------------------------------------------------------------------------------------
140 [MenuItem(ShowBurstTimingsText, false, 7)]
141 private static void ShowBurstTimings()
142 {
143 BurstEditorOptions.EnableBurstTimings = !BurstEditorOptions.EnableBurstTimings;
144 }
145
146 [MenuItem(ShowBurstTimingsText, true, 7)]
147 private static bool ShowBurstTimingsValidate()
148 {
149 Menu.SetChecked(ShowBurstTimingsText, BurstEditorOptions.EnableBurstTimings);
150 return BurstCompilerService.IsInitialized && BurstEditorOptions.EnableBurstCompilation;
151 }
152
153 // ----------------------------------------------------------------------------------------------
154 // #6 Open Inspector...
155 // ----------------------------------------------------------------------------------------------
156 [MenuItem(BurstInspectorText, false, 8)]
157 private static void BurstInspector()
158 {
159 // Get existing open window or if none, make a new one:
160 BurstInspectorGUI window = EditorWindow.GetWindow<BurstInspectorGUI>("Burst Inspector");
161 window.Show();
162 }
163
164 [MenuItem(BurstInspectorText, true, 8)]
165 private static bool BurstInspectorValidate()
166 {
167 return BurstCompilerService.IsInitialized;
168 }
169
170 private static void ChangeOptionSafely(Action callback)
171 {
172 try
173 {
174 RequiresRestartUtility.CalledFromUI = true;
175
176 callback();
177
178 if (RequiresRestartUtility.RequiresRestart)
179 {
180 EditorUtility.DisplayDialog(
181 "Editor Restart Required",
182 "This setting will not be applied until the Editor has been restarted. Please restart the Editor to continue.",
183 "OK");
184 BurstCompiler.Shutdown();
185 }
186 }
187 finally
188 {
189 RequiresRestartUtility.RequiresRestart = false;
190 RequiresRestartUtility.CalledFromUI = false;
191 }
192 }
193 }
194}