/dependencies/brofiler/include/Brofiler.h

https://bitbucket.org/Connway/shibboleth · C Header · 285 lines · 241 code · 20 blank · 24 comment · 1 complexity · 4cdf80a99b29d2818dac91eb2ee28726 MD5 · raw file

  1. #pragma once
  2. //#if !defined(USE_PROFILER) && (!defined(_FINALRELEASE) || defined(EMULATE_DEVELOPER_FINAL_RELEASE))
  3. // #define USE_PROFILER 1
  4. //#endif
  5. #if USE_PROFILER
  6. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  7. // EXPORTS
  8. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. #ifdef PROFILER_EXPORTS
  10. #define BROFILER_API __declspec(dllexport)
  11. #else
  12. #define BROFILER_API //__declspec(dllimport)
  13. #endif
  14. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  15. #define BRO_CONCAT_IMPL(x, y) x##y
  16. #define BRO_CONCAT(x, y) BRO_CONCAT_IMPL(x, y)
  17. #define BRO_INLINE __forceinline
  18. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  19. #pragma region Colors.h
  20. namespace Profiler
  21. {
  22. // Source: http://msdn.microsoft.com/en-us/library/system.windows.media.colors(v=vs.110).aspx
  23. // Image: http://i.msdn.microsoft.com/dynimg/IC24340.png
  24. struct Color
  25. {
  26. enum
  27. {
  28. Null = 0x00000000,
  29. AliceBlue = 0xFFF0F8FF,
  30. AntiqueWhite = 0xFFFAEBD7,
  31. Aqua = 0xFF00FFFF,
  32. Aquamarine = 0xFF7FFFD4,
  33. Azure = 0xFFF0FFFF,
  34. Beige = 0xFFF5F5DC,
  35. Bisque = 0xFFFFE4C4,
  36. Black = 0xFF000000,
  37. BlanchedAlmond = 0xFFFFEBCD,
  38. Blue = 0xFF0000FF,
  39. BlueViolet = 0xFF8A2BE2,
  40. Brown = 0xFFA52A2A,
  41. BurlyWood = 0xFFDEB887,
  42. CadetBlue = 0xFF5F9EA0,
  43. Chartreuse = 0xFF7FFF00,
  44. Chocolate = 0xFFD2691E,
  45. Coral = 0xFFFF7F50,
  46. CornflowerBlue = 0xFF6495ED,
  47. Cornsilk = 0xFFFFF8DC,
  48. Crimson = 0xFFDC143C,
  49. Cyan = 0xFF00FFFF,
  50. DarkBlue = 0xFF00008B,
  51. DarkCyan = 0xFF008B8B,
  52. DarkGoldenRod = 0xFFB8860B,
  53. DarkGray = 0xFFA9A9A9,
  54. DarkGreen = 0xFF006400,
  55. DarkKhaki = 0xFFBDB76B,
  56. DarkMagenta = 0xFF8B008B,
  57. DarkOliveGreen = 0xFF556B2F,
  58. DarkOrange = 0xFFFF8C00,
  59. DarkOrchid = 0xFF9932CC,
  60. DarkRed = 0xFF8B0000,
  61. DarkSalmon = 0xFFE9967A,
  62. DarkSeaGreen = 0xFF8FBC8F,
  63. DarkSlateBlue = 0xFF483D8B,
  64. DarkSlateGray = 0xFF2F4F4F,
  65. DarkTurquoise = 0xFF00CED1,
  66. DarkViolet = 0xFF9400D3,
  67. DeepPink = 0xFFFF1493,
  68. DeepSkyBlue = 0xFF00BFFF,
  69. DimGray = 0xFF696969,
  70. DodgerBlue = 0xFF1E90FF,
  71. FireBrick = 0xFFB22222,
  72. FloralWhite = 0xFFFFFAF0,
  73. ForestGreen = 0xFF228B22,
  74. Fuchsia = 0xFFFF00FF,
  75. Gainsboro = 0xFFDCDCDC,
  76. GhostWhite = 0xFFF8F8FF,
  77. Gold = 0xFFFFD700,
  78. GoldenRod = 0xFFDAA520,
  79. Gray = 0xFF808080,
  80. Green = 0xFF008000,
  81. GreenYellow = 0xFFADFF2F,
  82. HoneyDew = 0xFFF0FFF0,
  83. HotPink = 0xFFFF69B4,
  84. IndianRed = 0xFFCD5C5C,
  85. Indigo = 0xFF4B0082,
  86. Ivory = 0xFFFFFFF0,
  87. Khaki = 0xFFF0E68C,
  88. Lavender = 0xFFE6E6FA,
  89. LavenderBlush = 0xFFFFF0F5,
  90. LawnGreen = 0xFF7CFC00,
  91. LemonChiffon = 0xFFFFFACD,
  92. LightBlue = 0xFFADD8E6,
  93. LightCoral = 0xFFF08080,
  94. LightCyan = 0xFFE0FFFF,
  95. LightGoldenRodYellow = 0xFFFAFAD2,
  96. LightGray = 0xFFD3D3D3,
  97. LightGreen = 0xFF90EE90,
  98. LightPink = 0xFFFFB6C1,
  99. LightSalmon = 0xFFFFA07A,
  100. LightSeaGreen = 0xFF20B2AA,
  101. LightSkyBlue = 0xFF87CEFA,
  102. LightSlateGray = 0xFF778899,
  103. LightSteelBlue = 0xFFB0C4DE,
  104. LightYellow = 0xFFFFFFE0,
  105. Lime = 0xFF00FF00,
  106. LimeGreen = 0xFF32CD32,
  107. Linen = 0xFFFAF0E6,
  108. Magenta = 0xFFFF00FF,
  109. Maroon = 0xFF800000,
  110. MediumAquaMarine = 0xFF66CDAA,
  111. MediumBlue = 0xFF0000CD,
  112. MediumOrchid = 0xFFBA55D3,
  113. MediumPurple = 0xFF9370DB,
  114. MediumSeaGreen = 0xFF3CB371,
  115. MediumSlateBlue = 0xFF7B68EE,
  116. MediumSpringGreen = 0xFF00FA9A,
  117. MediumTurquoise = 0xFF48D1CC,
  118. MediumVioletRed = 0xFFC71585,
  119. MidnightBlue = 0xFF191970,
  120. MintCream = 0xFFF5FFFA,
  121. MistyRose = 0xFFFFE4E1,
  122. Moccasin = 0xFFFFE4B5,
  123. NavajoWhite = 0xFFFFDEAD,
  124. Navy = 0xFF000080,
  125. OldLace = 0xFFFDF5E6,
  126. Olive = 0xFF808000,
  127. OliveDrab = 0xFF6B8E23,
  128. Orange = 0xFFFFA500,
  129. OrangeRed = 0xFFFF4500,
  130. Orchid = 0xFFDA70D6,
  131. PaleGoldenRod = 0xFFEEE8AA,
  132. PaleGreen = 0xFF98FB98,
  133. PaleTurquoise = 0xFFAFEEEE,
  134. PaleVioletRed = 0xFFDB7093,
  135. PapayaWhip = 0xFFFFEFD5,
  136. PeachPuff = 0xFFFFDAB9,
  137. Peru = 0xFFCD853F,
  138. Pink = 0xFFFFC0CB,
  139. Plum = 0xFFDDA0DD,
  140. PowderBlue = 0xFFB0E0E6,
  141. Purple = 0xFF800080,
  142. Red = 0xFFFF0000,
  143. RosyBrown = 0xFFBC8F8F,
  144. RoyalBlue = 0xFF4169E1,
  145. SaddleBrown = 0xFF8B4513,
  146. Salmon = 0xFFFA8072,
  147. SandyBrown = 0xFFF4A460,
  148. SeaGreen = 0xFF2E8B57,
  149. SeaShell = 0xFFFFF5EE,
  150. Sienna = 0xFFA0522D,
  151. Silver = 0xFFC0C0C0,
  152. SkyBlue = 0xFF87CEEB,
  153. SlateBlue = 0xFF6A5ACD,
  154. SlateGray = 0xFF708090,
  155. Snow = 0xFFFFFAFA,
  156. SpringGreen = 0xFF00FF7F,
  157. SteelBlue = 0xFF4682B4,
  158. Tan = 0xFFD2B48C,
  159. Teal = 0xFF008080,
  160. Thistle = 0xFFD8BFD8,
  161. Tomato = 0xFFFF6347,
  162. Turquoise = 0xFF40E0D0,
  163. Violet = 0xFFEE82EE,
  164. Wheat = 0xFFF5DEB3,
  165. White = 0xFFFFFFFF,
  166. WhiteSmoke = 0xFFF5F5F5,
  167. Yellow = 0xFFFFFF00,
  168. YellowGreen = 0xFF9ACD32,
  169. };
  170. };
  171. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  172. }
  173. #pragma endregion
  174. #pragma region Event.h
  175. namespace Profiler
  176. {
  177. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  178. struct BROFILER_API ThreadDescription
  179. {
  180. unsigned long threadID;
  181. const char* name;
  182. ThreadDescription(const char* threadName = "MainThread");
  183. };
  184. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  185. extern "C" BROFILER_API __int64 GetTime();
  186. BROFILER_API __int64 GetTimeMicroSeconds();
  187. BROFILER_API void NextFrame();
  188. BROFILER_API bool IsActive();
  189. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  190. struct EventDescription;
  191. struct Frame;
  192. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  193. struct EventTime
  194. {
  195. __int64 start;
  196. __int64 finish;
  197. BRO_INLINE void Start() { start = GetTime(); }
  198. BRO_INLINE void Stop() { finish = GetTime(); }
  199. };
  200. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  201. struct EventData : public EventTime
  202. {
  203. const EventDescription* description;
  204. };
  205. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  206. struct BROFILER_API EventDescription
  207. {
  208. bool isSampling;
  209. // HOT \\
  210. // Have to place "hot" variables at the beginning of the class (here will be some padding)
  211. // COLD //
  212. const char* name;
  213. const char* file;
  214. unsigned long line;
  215. unsigned long index;
  216. unsigned long color;
  217. static EventDescription* Create(const char* eventName, const char* fileName, const unsigned long fileLine, const unsigned long eventColor = Color::Null);
  218. private:
  219. friend class EventDescriptionBoard;
  220. EventDescription();
  221. EventDescription& operator=(const EventDescription&);
  222. };
  223. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  224. struct BROFILER_API Event
  225. {
  226. EventData* data;
  227. static EventData* Start(const EventDescription& description);
  228. static void Stop(EventData& data);
  229. Event( const EventDescription& description )
  230. {
  231. data = Start(description);
  232. }
  233. ~Event()
  234. {
  235. if (data)
  236. Stop(*data);
  237. }
  238. };
  239. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  240. struct BROFILER_API Category : public Event
  241. {
  242. Category( const EventDescription& description );
  243. };
  244. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  245. }
  246. #pragma endregion
  247. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  248. #define BROFILER_EVENT(NAME) static Profiler::EventDescription* BRO_CONCAT(autogenerated_description_, __LINE__) = Profiler::EventDescription::Create( NAME, __FILE__, __LINE__ ); \
  249. Profiler::Event BRO_CONCAT(autogenerated_event_, __LINE__)( *(BRO_CONCAT(autogenerated_description_, __LINE__)) ); \
  250. #define PROFILE BROFILER_EVENT(__FUNCSIG__)
  251. #define BROFILER_INLINE_EVENT(NAME, CODE) { BROFILER_EVENT(NAME) CODE; }
  252. #define BROFILER_CATEGORY(NAME, COLOR) static Profiler::EventDescription* BRO_CONCAT(autogenerated_description_, __LINE__) = Profiler::EventDescription::Create( NAME, __FILE__, __LINE__, (unsigned long)COLOR ); \
  253. Profiler::Category BRO_CONCAT(autogenerated_event_, __LINE__)( *(BRO_CONCAT(autogenerated_description_, __LINE__)) ); \
  254. #define BROFILER_FRAME(FRAME_NAME) static Profiler::ThreadDescription currentFrameDescription(FRAME_NAME);\
  255. Profiler::NextFrame(); \
  256. BROFILER_EVENT("Frame") \
  257. #define BROFILER_THREAD(FRAME_NAME) Profiler::ThreadDescription currentFrameDescription(FRAME_NAME);\
  258. #else
  259. #define BROFILER_EVENT(NAME)
  260. #define PROFILE
  261. #define BROFILER_INLINE_EVENT(NAME, CODE) { CODE; }
  262. #define BROFILER_CATEGORY(NAME, COLOR)
  263. #define BROFILER_FRAME(NAME)
  264. #define BROFILER_THREAD(FRAME_NAME)
  265. #endif