123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- #if UNITY_EDITOR
- using System;
- using System.Diagnostics;
- using System.Reflection;
- using System.Text;
-
- namespace Unity.Burst.Editor
- {
- [DebuggerDisplay("{GetDisplayName(),nq}")]
- internal class BurstCompileTarget
- {
- public BurstCompileTarget(MethodInfo method, Type jobType, Type interfaceType, bool isStaticMethod)
- {
- Method = method ?? throw new ArgumentNullException(nameof(method));
- JobType = jobType ?? throw new ArgumentNullException(nameof(jobType));
- JobInterfaceType = interfaceType; // can be null
- // This is important to clone the options as we don't want to modify the global instance
- Options = BurstCompiler.Options.Clone();
- Options.EnableBurstCompilation = true;
- // Enable safety checks by default to match inspector default behavior
- Options.EnableBurstSafetyChecks = true;
- TargetCpu = BurstTargetCpu.Auto;
- // The BurstCompilerAttribute can be either on the type or on the method
- IsStaticMethod = isStaticMethod;
- }
-
- /// <summary>
- /// <c>true</c> if the <see cref="Method"/> is directly tagged with a [BurstCompile] attribute
- /// </summary>
- public readonly bool IsStaticMethod;
-
- /// <summary>
- /// The Execute method of the target's producer type.
- /// </summary>
- public readonly MethodInfo Method;
-
- /// <summary>
- /// The type of the actual job (i.e. BoidsSimulationJob).
- /// </summary>
- public readonly Type JobType;
-
- /// <summary>
- /// The interface of the job (IJob, IJobParallelFor...)
- /// </summary>
- public readonly Type JobInterfaceType;
-
- /// <summary>
- /// The default compiler options
- /// </summary>
- public readonly BurstCompilerOptions Options;
-
- public BurstTargetCpu TargetCpu { get; set; }
-
- /// <summary>
- /// Set to true if burst compilation is actually requested via proper `[BurstCompile]` attribute:
- /// - On the job if it is a job only
- /// - On the method and parent class it if is a static method
- /// </summary>
- public bool HasRequiredBurstCompileAttributes => BurstCompilerOptions.HasBurstCompileAttribute(JobType) && (!IsStaticMethod || BurstCompilerOptions.HasBurstCompileAttribute(Method));
-
- /// <summary>
- /// Generated raw disassembly (IR, IL, ASM...), or null if disassembly failed (only valid for the current TargetCpu)
- /// </summary>
- public string RawDisassembly;
-
- /// <summary>
- /// Formatted disassembly for the associated <see cref="RawDisassembly"/>, currently only valid for <see cref="Unity.Burst.Editor.DisassemblyKind.Asm"/>
- /// </summary>
- public string FormattedDisassembly;
-
- public DisassemblyKind DisassemblyKind;
-
- public bool IsDarkMode { get; set; }
-
- public bool IsBurstError { get; set; }
-
- public bool IsLoading = false;
-
- public bool JustLoaded = false;
-
- public string GetDisplayName()
- {
- var displayName = IsStaticMethod ? Pretty(Method) : $"{Pretty(JobType)} - ({Pretty(JobInterfaceType)})";
-
- // Remove the '<>c__DisplayClass_' part of the name - this is only added for C# Entities.ForEach jobs to trick the C# debugging tools into
- // treating them like lambdas. This is removed wherever possible from user facing tools (like the Unity profiler), so we should do the same.
- return displayName.Replace("<>c__DisplayClass_", "");
- }
-
- private static string Pretty(MethodInfo method)
- {
- var builder = new StringBuilder();
- builder.Append(Pretty(method.DeclaringType));
- builder.Append(".");
- builder.Append(method.Name);
- builder.Append("(");
- var parameters = method.GetParameters();
- for (var i = 0; i < parameters.Length; i++)
- {
- var param = parameters[i];
- if (i > 0) builder.Append(", ");
- builder.Append(Pretty(param.ParameterType));
- }
-
- builder.Append(")");
- return builder.ToString();
- }
-
- internal static string Pretty(Type type)
- {
- if (type == typeof(bool))
- {
- return "bool";
- }
- if (type == typeof(int))
- {
- return "int";
- }
- if (type == typeof(long))
- {
- return "long";
- }
- if (type == typeof(uint))
- {
- return "uint";
- }
- if (type == typeof(ulong))
- {
- return "ulong";
- }
- if (type == typeof(short))
- {
- return "short";
- }
- if (type == typeof(ushort))
- {
- return "ushort";
- }
- if (type == typeof(byte))
- {
- return "byte";
- }
- if (type == typeof(sbyte))
- {
- return "sbyte";
- }
- if (type == typeof(float))
- {
- return "float";
- }
- if (type == typeof(double))
- {
- return "double";
- }
- if (type == typeof(string))
- {
- return "string";
- }
- if (type == typeof(object))
- {
- return "object";
- }
- if (type == typeof(char))
- {
- return "char";
- }
-
- // When displaying job interface type, display the interface name of Unity.Jobs namespace
- var typeName = type.IsInterface && type.Name.StartsWith("IJob") ? type.Name : type.ToString();
- return typeName.Replace("+", ".");
- }
- }
-
- internal enum DisassemblyKind
- {
- Asm = 0,
- IL = 1,
- UnoptimizedIR = 2,
- OptimizedIR = 3,
- IRPassAnalysis = 4
- }
- }
- #endif
|