1 ///start file generated from microprofile.html 2 #ifdef MICROPROFILE_EMBED_HTML 3 const char g_MicroProfileHtml_begin_0[] = 4 "<!DOCTYPE HTML>\n" 5 "<html>\n" 6 "<head>\n" 7 "<title>MicroProfile Capture</title>\n" 8 "<style>\n" 9 "/* about css: http://bit.ly/1eMQ42U */\n" 10 "body {margin: 0px;padding: 0px; font: 12px Courier New;background-color:#474747; color:white;overflow:hidden;}\n" 11 "ul {list-style-type: none;margin: 0;padding: 0;}\n" 12 "li{display: inline; float:left;border:5px; position:relative;text-align:center;}\n" 13 "a {\n" 14 " float:left;\n" 15 " text-decoration:none;\n" 16 " display: inline;\n" 17 " text-align: center;\n" 18 " padding:5px;\n" 19 " padding-bottom:0px;\n" 20 " padding-top:0px;\n" 21 " color: #FFFFFF;\n" 22 " background-color: #474747;\n" 23 "}\n" 24 "a:hover, a:active{\n" 25 " background-color: #000000;\n" 26 "}\n" 27 "\n" 28 "ul ul {\n" 29 " position:absolute;\n" 30 " left:0;\n" 31 " top:100%;\n" 32 " margin-left:-999em;\n" 33 "}\n" 34 "li:hover ul {\n" 35 " margin-left:0;\n" 36 " margin-right:0;\n" 37 "}\n" 38 "ul li ul{ display:block;float:none;width:100%;}\n" 39 "ul li ul li{ display:block;float:none;width:100%;}\n" 40 "li li a{ display:block;float:none;width:100%;text-align:left;}\n" 41 "#nav li:hover div {margin-left:0;}\n" 42 ".help {position:absolute;z-index:5;text-align:left;padding:2px;margin-left:-999em;background-color: #313131;width:300px;}\n" 43 ".helpstart {position:absolute;z-index:5;text-align:left;padding:2px;background-color: #313131;width:300px;display:none}\n" 44 ".root {z-index:1;position:absolute;top:0px;left:0px;}\n" 45 "</style>\n" 46 "</head>\n" 47 "<body style=\"\">\n" 48 "<canvas id=\"History\" height=\"70\" style=\"background-color:#474747;margin:0px;padding:0px;\"></canvas><canvas id=\"DetailedView\" height=\"200\" style=\"background-color:#474747;margin:0px;padding:0px;\"></canvas>\n" 49 "<div id=\"root\" class=\"root\">\n" 50 "<ul id=\"nav\">\n" 51 "<li><a href=\"javascript:void(0)\" onclick=\"ToggleDebugMode();\">?</a>\n" 52 "<div class=\"helpstart\" id=\"helpwindow\" style=\"left:20px;top:20px\">\n" 53 "History View:<br>\n" 54 "Click + Drag: Pan View<br>\n" 55 "Right Click + Drag : Zoom on region<br>\n" 56 "Click Frame : Center on frame<br>\n" 57 "<hr>\n" 58 "Main View:<br>\n" 59 "Ctrl + Mouse up/down: Zoom<br>\n" 60 "Mousewheel : Zoom<br>\n" 61 "Right Click + Drag: Zoom to region<br>\n" 62 "Ctrl + Drag: Pan<br>\n" 63 "Click + Drag: Pan<br>\n" 64 "<hr>\n" 65 "<table style=\"width:100%\">\n" 66 "<tr>\n" 67 "<td width=\"50%\" align=\"left\"><a href=\'javascript:void(0)\' onclick=\"ShowHelp(0, 0);\">Close</a></td>\n" 68 "<td width=\"50%\" align=\"right\"><a href=\'javascript:void(0)\' onclick=\"ShowHelp(0, 1);\">Close, Never Show</a></td>\n" 69 "</tr>\n" 70 "</table>\n" 71 "</div>\n" 72 "<div class=\"help\" id=\"divFrameInfo\" style=\"left:20px;top:300px;width:auto;\">\n" 73 "</div>\n" 74 "</li>\n" 75 "<li><a id=\'ModeSubMenuText\'>Mode</a>\n" 76 " <ul id=\'ModeSubMenu\'>\n" 77 " <li><a href=\"javascript:void(0)\" onclick=\"SetMode(\'timers\', 0);\" id=\"buttonTimers\">Timers</a></li>\n" 78 " <li><a href=\"javascript:void(0)\" onclick=\"SetMode(\'timers\', 1);\" id=\"buttonGroups\">Groups</a></li> \n" 79 " <li><a href=\"javascript:void(0)\" onclick=\"SetMode(\'timers\', 2);\" id=\"buttonThreads\">Threads</a></li>\n" 80 " <li><a href=\"javascript:void(0)\" onclick=\"SetMode(\'detailed\', 0);\" id=\"buttonDetailed\">Detailed</a></li>\n" 81 " </ul>\n" 82 "</li>\n" 83 "<li><a>Reference</a>\n" 84 " <ul id=\'ReferenceSubMenu\'>\n" 85 " <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'5ms\');\">5ms</a></li>\n" 86 " <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'10ms\');\">10ms</a></li>\n" 87 " <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'15ms\');\">15ms</a></li>\n" 88 " <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'20ms\');\">20ms</a></li>\n" 89 " <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'33ms\');\">33ms</a></li>\n" 90 " <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'50ms\');\">50ms</a></li>\n" 91 " <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'100ms\');\">100ms</a></li>\n" 92 " <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'250ms\');\">250ms</a></li>\n" 93 " <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'500ms\');\">500ms</a></li>\n" 94 " <li><a href=\"javascript:void(0)\" onclick=\"SetReferenceTime(\'1000ms\');\">1000ms</a></li>\n" 95 " </ul>\n" 96 "</li>\n" 97 "<li id=\"ilThreads\"><a>Threads</a>\n" 98 " <ul id=\"ThreadSubMenu\">\n" 99 " <li><a href=\"javascript:void(0)\" onclick=\"ToggleThread();\">All</a></li>\n" 100 " <li><a>---</a></li>\n" 101 " </ul>\n" 102 "</li>\n" 103 "<li id=\"ilGroups\"><a>Groups</a>\n" 104 " <ul id=\"GroupSubMenu\">\n" 105 " <li><a href=\"javascript:void(0)\" onclick=\"ToggleGroup();\">All</a></li>\n" 106 " <li><a>---</a></li>\n" 107 " </ul>\n" 108 "</li>\n" 109 "<li id=\"ilOptions\"><a>Options </a>\n" 110 " <ul id=\'OptionsMenu\'>\n" 111 " <li><a href=\"javascript:void(0)\" onclick=\"ToggleContextSwitch();\">Context Switch</a></li>\n" 112 " <li><a href=\"javascript:void(0)\" onclick=\"ToggleDisableMerge();\">MergeDisable</a></li>\n" 113 " <li><a href=\"javascript:void(0)\" onclick=\"ToggleDisableLod();\">LodDisable</a></li>\n" 114 " <li id=\'GroupColors\'><a href=\"javascript:void(0)\" onclick=\"ToggleGroupColors();\">Group Colors</a></li>\n" 115 " <li id=\'TimersMeta\'><a href=\"javascript:void(0)\" onclick=\"ToggleTimersMeta();\">Meta</a></li>\n" 116 " <li id=\'ShowHelp\'><a href=\"javascript:void(0)\" onclick=\"ShowHelp(1,1);\">Help</a></li>\n" 117 "<!-- <li><a href=\"javascript:void(0)\" onclick=\"ToggleDebug();\">DEBUG</a></li> -->\n" 118 " </ul>\n" 119 "</li>\n" 120 "</ul>\n" 121 "</div>\n" 122 "<script>\n" 123 "function InvertColor(hexTripletColor) {\n" 124 " var color = hexTripletColor;\n" 125 " color = color.substring(1); // remove #\n" 126 " color = parseInt(color, 16); // convert to integer\n" 127 " var R = ((color >> 16) % 256)/255.0;\n" 128 " var G = ((color >> 8) % 256)/255.0;\n" 129 " var B = ((color >> 0) % 256)/255.0;\n" 130 " var lum = (0.2126*R + 0.7152*G + 0.0722*B);\n" 131 " if(lum < 0.7)\n" 132 " {\n" 133 " return \'#ffffff\';\n" 134 " }\n" 135 " else\n" 136 " {\n" 137 " return \'#333333\';\n" 138 " }\n" 139 "}\n" 140 "function InvertColorIndex(hexTripletColor) {\n" 141 " var color = hexTripletColor;\n" 142 " color = color.substring(1); // remove #\n" 143 " color = parseInt(color, 16); // convert to integer\n" 144 " var R = ((color >> 16) % 256)/255.0;\n" 145 " var G = ((color >> 8) % 256)/255.0;\n" 146 " var B = ((color >> 0) % 256)/255.0;\n" 147 " var lum = (0.2126*R + 0.7152*G + 0.0722*B);\n" 148 " if(lum < 0.7)\n" 149 " {\n" 150 " return 0;\n" 151 " }\n" 152 " else\n" 153 " {\n" 154 " return 1;\n" 155 " }\n" 156 "}\n" 157 "function MakeGroup(id, name, category, numtimers, isgpu, total, average, max, color)\n" 158 "{\n" 159 " var group = {\"id\":id, \"name\":name, \"category\":category, \"numtimers\":numtimers, \"isgpu\":isgpu, \"total\": total, \"average\" : average, \"max\" : max, \"color\":color};\n" 160 " return group;\n" 161 "}\n" 162 "\n" 163 "function MakeTimer(id, name, group, color, colordark, average, max, exclaverage, exclmax, callaverage, callcount, total, meta, metaavg, metamax)\n" 164 "{\n" 165 " var timer = {\"id\":id, \"name\":name, \"len\":name.length, \"color\":color, \"colordark\":colordark,\"timercolor\":color, \"textcolor\":InvertColor(color), \"group\":group, \"average\":average, \"max\":max, \"exclaverage\":exclaverage, \"exclmax\":exclmax, \"callaverage\":callaverage, \"callcount\":callcount, \"total\":total, \"meta\":meta, \"textcolorindex\":InvertColorIndex(color), \"metaavg\":metaavg, \"metamax\":metamax};\n" 166 " return timer;\n" 167 "}\n" 168 "function MakeFrame(id, framestart, frameend, framestartgpu, frameendgpu, ts, tt, ti)\n" 169 "{\n" 170 " var frame = {\"id\":id, \"framestart\":framestart, \"frameend\":frameend, \"framestartgpu\":framestartgpu, \"frameendgpu\":frameendgpu, \"ts\":ts, \"tt\":tt, \"ti\":ti};\n" 171 " return frame;\n" 172 "}\n" 173 "\n" 174 ""; 175 176 const size_t g_MicroProfileHtml_begin_0_size = sizeof(g_MicroProfileHtml_begin_0); 177 const char* g_MicroProfileHtml_begin[] = { 178 &g_MicroProfileHtml_begin_0[0], 179 }; 180 size_t g_MicroProfileHtml_begin_sizes[] = { 181 sizeof(g_MicroProfileHtml_begin_0), 182 }; 183 size_t g_MicroProfileHtml_begin_count = 1; 184 const char g_MicroProfileHtml_end_0[] = 185 "\n" 186 "\n" 187 "\n" 188 "var CanvasDetailedView = document.getElementById(\'DetailedView\');\n" 189 "var CanvasHistory = document.getElementById(\'History\');\n" 190 "var CanvasDetailedOffscreen = document.createElement(\'canvas\');\n" 191 "var g_Msg = \'0\';\n" 192 "\n" 193 "var Initialized = 0;\n" 194 "var fDetailedOffset = Frames[0].framestart;\n" 195 "var fDetailedRange = Frames[0].frameend - fDetailedOffset;\n" 196 "var nWidth = CanvasDetailedView.width;\n" 197 "var nHeight = CanvasDetailedView.height;\n" 198 "var ReferenceTime = 33;\n" 199 "var nHistoryHeight = 70;\n" 200 "var nOffsetY = 0;\n" 201 "var nOffsetBarsX = 0;\n" 202 "var nOffsetBarsY = 0;\n" 203 "var nBarsWidth = 80;\n" 204 "var NameWidth = 200;\n" 205 "var MouseButtonState = [0,0,0,0,0,0,0,0];\n" 206 "var KeyShiftDown = 0;\n" 207 "var MouseDragButton = 0;\n" 208 "var KeyCtrlDown = 0;\n" 209 "var FlipToolTip = 0;\n" 210 "var DetailedViewMouseX = 0;\n" 211 "var DetailedViewMouseY = 0;\n" 212 "var HistoryViewMouseX = -1;\n" 213 "var HistoryViewMouseY = -1;\n" 214 "var MouseHistory = 0;\n" 215 "var MouseDetailed = 0;\n" 216 "var FontHeight = 10;\n" 217 "var FontWidth = 1;\n" 218 "var FontAscent = 3; //Set manually\n" 219 "var Font = \'Bold \' + FontHeight + \'px Courier New\';\n" 220 "var FontFlash = \'Bold \' + 35 + \'px Courier New\';\n" 221 "var BoxHeight = FontHeight + 2;\n" 222 "var ThreadsActive = new Object();\n" 223 "var ThreadsAllActive = 1;\n" 224 "var GroupsActive = new Object();\n" 225 "var GroupsAllActive = 1;\n" 226 "var nMinWidth = 0.01;//subpixel width\n" 227 "var nMinWidthPan = 1.0;//subpixel width when panning\n" 228 "var nContextSwitchEnabled = 1;\n" 229 "var DisableLod = 0;\n" 230 "var DisableMerge = 0;\n" 231 "var GroupColors = 0;\n" 232 "var nModDown = 0;\n" 233 "var g_MSG = \'no\';\n" 234 "var nDrawCount = 0;\n" 235 "var nBackColors = [\'#474747\', \'#313131\' ];\n" 236 "var nBackColorOffset = \'#606060\';\n" 237 "var CSwitchColors =[\"#9DD8AF\",\"#D7B6DA\",\"#EAAC76\",\"#DBDA61\",\"#8AD5E1\",\"#8CE48B\",\"#C4D688\",\"#57E5C4\"];//generated by http://tools.medialab.sciences-po.fr/iwanthue/index.php\n" 238 "var CSwitchHeight = 5;\n" 239 "var FRAME_HISTORY_COLOR_CPU = \'#ff7f27\';\n" 240 "var FRAME_HISTORY_COLOR_GPU = \'#ffffff\';\n" 241 "var ZOOM_TIME = 0.5;\n" 242 "var AnimationActive = false;\n" 243 "var nHoverCSCpu = -1;\n" 244 "var nHoverCSCpuNext = -1;\n" 245 "var nHoverCSToolTip = null;\n" 246 "var nHoverToken = -1;\n" 247 "var nHoverFrame = -1;\n" 248 "var nHoverTokenIndex = -1;\n" 249 "var nHoverTokenLogIndex = -1;\n" 250 "var nHoverCounter = 0;\n" 251 "var nHoverCounterDelta = 8;\n" 252 "var nHoverTokenNext = -1;\n" 253 "var nHoverTokenLogIndexNext = -1;\n" 254 "var nHoverTokenIndexNext = -1;\n" 255 "var nHideHelp = 0;\n" 256 "\n" 257 "\n" 258 "var fFrameScale = 33.33;\n" 259 "var fRangeBegin = 0;\n" 260 "var fRangeEnd = -1;\n" 261 "var fRangeBeginNext = 0;\n" 262 "var fRangeEndNext = 0;\n" 263 "var fRangeBeginGpuNext = 0;\n" 264 "var fRangeEndGpuNext = 0;\n" 265 "var fRangeBeginHistory = -1;\n" 266 "var fRangeEndHistory = -1;\n" 267 "var fRangeBeginHistoryGpu = -1;\n" 268 "var fRangeEndHistoryGpu = -1;\n" 269 "var fRangeBeginSelect = 0;\n" 270 "var fRangeEndSelect = -1;\n" 271 "\n" 272 "var ModeDetailed = 0;\n" 273 "var ModeTimers = 1;\n" 274 "var Mode = ModeDetailed;\n" 275 "\n" 276 "var DebugDrawQuadCount = 0;\n" 277 "var DebugDrawTextCount = 0;\n" 278 "var ProfileMode = 0;\n" 279 "var ProfileFps = 0;\n" 280 "var ProfileFpsAggr = 0;\n" 281 "var ProfileFpsCount = 0;\n" 282 "var ProfileLastTimeStamp = new Date();\n" 283 "\n" 284 "var CSwitchCache = {};\n" 285 "var CSwitchOnlyThreads = [];\n" 286 "var ProfileData = {};\n" 287 "var ProfileStackTime = {};\n" 288 "var ProfileStackName = {};\n" 289 "var Debug = 1;\n" 290 "\n" 291 "var g_MaxStack = Array();\n" 292 "var g_TypeArray;\n" 293 "var g_TimeArray;\n" 294 "var g_IndexArray;\n" 295 "var LodData = new Array();\n" 296 "var NumLodSplits = 10;\n" 297 "var SplitMin = 100;\n" 298 "var SPLIT_LIMIT = 1e20;\n" 299 "var DPR = 1;\n" 300 "var DetailedRedrawState = {};\n" 301 "var OffscreenData;\n" 302 "var DetailedFrameCounter = 0;\n" 303 "var Invalidate = 0;\n" 304 "var GroupOrder = Array();\n" 305 "var ThreadOrder = Array();\n" 306 "var TimersGroups = 0;\n" 307 "var TimersMeta = 1;\n" 308 "var MetaLengths = Array();\n" 309 "var MetaLengthsAvg = Array();\n" 310 "var MetaLengthsMax = Array();\n" 311 "\n" 312 "\n" 313 "function ProfileModeClear()\n" 314 "{\n" 315 " if(ProfileMode)\n" 316 " {\n" 317 " ProfileData = new Object();\n" 318 " ProfileStackTime = new Array();\n" 319 " ProfileStackName = new Array();\n" 320 " }\n" 321 "}\n" 322 "function ProfileEnter(Name)\n" 323 "{\n" 324 " if(ProfileMode)\n" 325 " {\n" 326 " ProfileStackTime.push(new Date());\n" 327 " ProfileStackName.push(Name);\n" 328 " }\n" 329 "}\n" 330 "function ProfileLeave()\n" 331 "{\n" 332 " if(ProfileMode)\n" 333 " {\n" 334 " var Time = new Date();\n" 335 " var Delta = Time - ProfileStackTime.pop();\n" 336 " var Name = ProfileStackName.pop();\n" 337 " var Obj = ProfileData[Name];\n" 338 " if(!Obj)\n" 339 " {\n" 340 " Obj = new Object();\n" 341 " Obj.Count = 0;\n" 342 " Obj.Name = Name;\n" 343 " Obj.Time = 0;\n" 344 " ProfileData[Name] = Obj;\n" 345 " }\n" 346 " Obj.Time += Delta;\n" 347 " Obj.Count += 1;\n" 348 " }\n" 349 "}\n" 350 "\n" 351 "function ProfilePlot(s)\n" 352 "{\n" 353 " if(ProfileMode)\n" 354 " {\n" 355 " var A = ProfileData.Plot;\n" 356 " if(!A)\n" 357 " {\n" 358 " ProfileData.Plot = Array();\n" 359 " A = ProfileData.Plot;\n" 360 " }\n" 361 " if(A.length<10)\n" 362 " {\n" 363 " A.push(s);\n" 364 " }\n" 365 " }\n" 366 "}\n" 367 "function ProfileModeDump()\n" 368 "{\n" 369 " for(var idx in ProfileData)\n" 370 " {\n" 371 " var Timer = ProfileData[idx];\n" 372 " console.log(Timer.Name + \" \" + Timer.Time + \"ms \" + Timer.Count);\n" 373 " }\n" 374 "\n" 375 "}\n" 376 "function ProfileModeDraw(Canvas)\n" 377 "{\n" 378 " if(ProfileMode)\n" 379 " {\n" 380 " var StringArray = [];\n" 381 " for(var idx in ProfileData)\n" 382 " {\n" 383 " if(idx == \"Plot\")\n" 384 " continue;\n" 385 " var Timer = ProfileData[idx];\n" 386 " StringArray.push(Timer.Name);\n" 387 " StringArray.push(Timer.Time + \"ms\");\n" 388 " StringArray.push(\"#\");\n" 389 " StringArray.push(\"\" + Timer.Count);\n" 390 " }\n" 391 " StringArray.push(\"debug\");\n" 392 " StringArray.push(Debug);\n" 393 " var Time = new Date();\n" 394 " var Delta = Time - ProfileLastTimeStamp;\n" 395 " ProfileLastTimeStamp = Time;\n" 396 " StringArray.push(\"Frame Delta\");\n" 397 " StringArray.push(Delta + \"ms\");\n" 398 " if(ProfileMode == 2)\n" 399 " {\n" 400 " ProfileFpsAggr += Delta;\n" 401 " ProfileFpsCount ++ ;\n" 402 " var AggrFrames = 10;\n" 403 " if(ProfileFpsCount == AggrFrames)\n" 404 " {\n" 405 " ProfileFps = 1000 / (ProfileFpsAggr / AggrFrames);\n" 406 " ProfileFpsAggr = 0;\n" 407 " ProfileFpsCount = 0;\n" 408 " }\n" 409 " StringArray.push(\"FPS\");\n" 410 " StringArray.push(\"\" + ProfileFps.toFixed(2));\n" 411 " }\n" 412 "\n" 413 "\n" 414 " for(var i = 0; i < ProfileData.Plot; ++i)\n" 415 " {\n" 416 " StringArray.push(\"\");\n" 417 " StringArray.push(ProfileData.Plot[i]);\n" 418 " }\n" 419 " ProfileData.Plot = Array();\n" 420 " DrawToolTip(StringArray, Canvas, 0, 200);\n" 421 " }\n" 422 "}\n" 423 "\n" 424 "function ToggleDebugMode()\n" 425 "{\n" 426 " ProfileMode = (ProfileMode+1)%4;\n" 427 " console.log(\'Toggle Debug Mode \' + ProfileMode);\n" 428 "}\n" 429 "\n" 430 "function DetailedTotal()\n" 431 "{\n" 432 " var Total = 0;\n" 433 " for(var i = 0; i < Frames.length; i++)\n" 434 " {\n" 435 " var frfr = Frames[i];\n" 436 " Total += frfr.frameend - frfr.framestart;\n" 437 " }\n" 438 " return Total;\n" 439 "}\n" 440 "\n" 441 "function InitFrameInfo()\n" 442 "{\n" 443 "\n" 444 " var div = document.getElementById(\'divFrameInfo\');\n" 445 " var txt = \'\';\n" 446 " txt = txt + \'Timers View\' + \'<br>\';\n" 447 " txt = txt + \'Frames:\' + AggregateInfo.Frames +\'<br>\';\n" 448 " txt = txt + \'Time:\' + AggregateInfo.Time.toFixed(2) +\'ms<br>\';\n" 449 " txt = txt + \'<hr>\';\n" 450 " txt = txt + \'Detailed View\' + \'<br>\';\n" 451 " txt = txt + \'Frames:\' + Frames.length +\'<br>\';\n" 452 " txt = txt + \'Time:\' + DetailedTotal().toFixed(2) +\'ms<br>\';\n" 453 " div.innerHTML = txt;\n" 454 "}\n" 455 "function InitGroups()\n" 456 "{\n" 457 " for(groupid in GroupInfo)\n" 458 " {\n" 459 " var TimerArray = Array();\n" 460 " for(timerid in TimerInfo)\n" 461 " {\n" 462 " if(TimerInfo[timerid].group == groupid)\n" 463 " {\n" 464 " TimerArray.push(timerid);\n" 465 " }\n" 466 " }\n" 467 " GroupInfo[groupid].TimerArray = TimerArray;\n" 468 " }\n" 469 "}\n" 470 "\n" 471 "function InitThreadMenu()\n" 472 "{\n" 473 " var ulThreadMenu = document.getElementById(\'ThreadSubMenu\');\n" 474 " var MaxLen = 7;\n" 475 " ThreadOrder = CreateOrderArray(ThreadNames, function(a){return a;});\n" 476 " for(var idx in ThreadOrder)\n" 477 " {\n" 478 " var name = ThreadNames[ThreadOrder[idx]];\n" 479 " var li = document.createElement(\'li\');\n" 480 " if(name.length > MaxLen)\n" 481 " {\n" 482 " MaxLen = name.length;\n" 483 " }\n" 484 " li.innerText = name;\n" 485 " var asText = li.innerHTML;\n" 486 " var html = \'<a href=\"javascript:void(0)\" onclick=\"ToggleThread(\\'\' + name + \'\\');\">\' + asText + \'</a>\';\n" 487 " li.innerHTML = html;\n" 488 " ulThreadMenu.appendChild(li);\n" 489 " }\n" 490 " var LenStr = (5+(1+MaxLen) * (1+FontWidth)) + \'px\';\n" 491 " var Lis = ulThreadMenu.getElementsByTagName(\'li\');\n" 492 " for(var i = 0; i < Lis.length; ++i)\n" 493 " {\n" 494 " Lis[i].style[\'width\'] = LenStr;\n" 495 " }\n" 496 "}\n" 497 "\n" 498 "function UpdateThreadMenu()\n" 499 "{\n" 500 " var ulThreadMenu = document.getElementById(\'ThreadSubMenu\');\n" 501 " var as = ulThreadMenu.getElementsByTagName(\'a\');\n" 502 " for(var i = 0; i < as.length; ++i)\n" 503 " {\n" 504 " var elem = as[i];\n" 505 " var inner = elem.innerText;\n" 506 " var bActive = false;\n" 507 " if(i < 2)\n" 508 " {\n" 509 " if(inner == \'All\')\n" 510 " {\n" 511 " bActive = ThreadsAllActive;\n" 512 " }\n" 513 " }\n" 514 " else\n" 515 " {\n" 516 " bActive = ThreadsActive[inner];\n" 517 " }\n" 518 " if(bActive)\n" 519 " {\n" 520 " elem.style[\'text-decoration\'] = \'underline\';\n" 521 " }\n" 522 " else\n" 523 " {\n" 524 " elem.style[\'text-decoration\'] = \'none\';\n" 525 " }\n" 526 " }\n" 527 "}\n" 528 "\n" 529 "function ToggleThread(ThreadName)\n" 530 "{\n" 531 " if(ThreadName)\n" 532 " {\n" 533 " if(ThreadsActive[ThreadName])\n" 534 " {\n" 535 " ThreadsActive[ThreadName] = false;\n" 536 " }\n" 537 " else\n" 538 " {\n" 539 " ThreadsActive[ThreadName] = true;\n" 540 " }\n" 541 " }\n" 542 " else\n" 543 " {\n" 544 " if(ThreadsAllActive)\n" 545 " {\n" 546 " ThreadsAllActive = 0;\n" 547 " }\n" 548 " else\n" 549 " {\n" 550 " ThreadsAllActive = 1;\n" 551 " }\n" 552 " }\n" 553 " Invalidate = 0;\n" 554 " UpdateThreadMenu();\n" 555 " WriteCookie();\n" 556 " Draw(1);\n" 557 "\n" 558 "}\n" 559 "\n" 560 "function CreateOrderArray(Source, NameFunc)\n" 561 "{\n" 562 " var Temp = Array(Source.length);\n" 563 " for(var i = 0; i < Source.length; ++i)\n" 564 " {\n" 565 " Temp[i] = {};\n" 566 " Temp[i].index = i;\n" 567 " Temp[i].namezz = NameFunc(Source[i]).toLowerCase();\n" 568 " }\n" 569 " Temp.sort(function(l, r)\n" 570 " { \n" 571 " if(r.namezz<l.namezz)\n" 572 " {return 1;}\n" 573 " if(l.namezz<r.namezz)\n" 574 " {return -1;} \n" 575 " return 0;\n" 576 " } );\n" 577 " var OrderArray = Array(Source.length);\n" 578 " for(var i = 0; i < Source.length; ++i)\n" 579 " {\n" 580 " OrderArray[i] = Temp[i].index;\n" 581 " }\n" 582 " return OrderArray;\n" 583 "}\n" 584 "\n" 585 "\n" 586 "function InitGroupMenu()\n" 587 "{\n" 588 " var ulGroupMenu = document.getElementById(\'GroupSubMenu\');\n" 589 " var MaxLen = 7;\n" 590 " var MenuArray = Array();\n" 591 " for(var i = 0; i < GroupInfo.length; ++i)\n" 592 " {\n" 593 " var x = {};\n" 594 " x.IsCategory = 0;\n" 595 " x.category = GroupInfo[i].category;\n" 596 " x.name = GroupInfo[i].name;\n" 597 " x.index = i;\n" 598 " MenuArray.push(x);\n" 599 " }\n" 600 " for(var i = 0; i < CategoryInfo.length; ++i)\n" 601 " {\n" 602 " var x = {};\n" 603 " x.IsCategory = 1;\n" 604 " x.category = i;\n" 605 " x.name = CategoryInfo[i];\n" 606 " x.index = i;\n" 607 " MenuArray.push(x);\n" 608 " }\n" 609 " var OrderFunction = function(a){ return a.category + \"__\" + a.name; };\n" 610 " var OrderFunctionMenu = function(a){ return a.IsCategory ? (a.category + \'\') : (a.category + \"__\" + a.name); };\n" 611 " GroupOrder = CreateOrderArray(GroupInfo, OrderFunction);\n" 612 " var MenuOrder = CreateOrderArray(MenuArray, OrderFunctionMenu);\n" 613 "\n" 614 " for(var idx in MenuOrder)\n" 615 " {\n" 616 " var MenuItem = MenuArray[MenuOrder[idx]];\n" 617 " var name = MenuItem.name;\n" 618 " var li = document.createElement(\'li\');\n" 619 " if(name.length > MaxLen)\n" 620 " {\n" 621 " MaxLen = name.length;\n" 622 " }\n" 623 " var jsfunc = \'\';\n" 624 " if(MenuItem.IsCategory)\n" 625 " { \n" 626 " li.innerText = \'[\' + name + \']\';\n" 627 " jsfunc = \"ToggleCategory\";\n" 628 " }\n" 629 " else\n" 630 " {\n" 631 " li.innerText = name;\n" 632 " jsfunc = \"ToggleGroup\";\n" 633 " }\n" 634 " var asText = li.innerHTML;\n" 635 " var html = \'<a href=\"javascript:void(0)\" onclick=\"\' + jsfunc + \'(\\'\' + name + \'\\');\">\' + asText + \'</a>\';\n" 636 " li.innerHTML = html;\n" 637 " ulGroupMenu.appendChild(li);\n" 638 " }\n" 639 " var LenStr = (5+(1+MaxLen) * FontWidth) + \'px\';\n" 640 " var Lis = ulGroupMenu.getElementsByTagName(\'li\');\n" 641 " for(var i = 0; i < Lis.length; ++i)\n" 642 " {\n" 643 " Lis[i].style[\'width\'] = LenStr;\n" 644 " }\n" 645 " UpdateGroupMenu();\n" 646 "}\n" 647 "\n" 648 "function UpdateGroupMenu()\n" 649 "{\n" 650 " var ulThreadMenu = document.getElementById(\'GroupSubMenu\');\n" 651 " var as = ulThreadMenu.getElementsByTagName(\'a\');\n" 652 " for(var i = 0; i < as.length; ++i)\n" 653 " {\n" 654 " var elem = as[i];\n" 655 " var inner = elem.innerText;\n" 656 " var bActive = false;\n" 657 " if(i < 2)\n" 658 " {\n" 659 " if(inner == \'All\')\n" 660 " {\n" 661 " bActive = GroupsAllActive;\n" 662 " }\n" 663 " }\n" 664 " else\n" 665 " {\n" 666 " var CategoryString = inner.length>2 ? inner.substring(1, inner.length-2) : \"\";\n" 667 " var CategoryIdx = CategoryIndex(CategoryString);\n" 668 " if(inner[0] == \'[\' && inner[inner.length-1] == \']\' && CategoryIdx >= 0)\n" 669 " {\n" 670 " bActive = IsCategoryActive(CategoryIdx);\n" 671 " }\n" 672 " else\n" 673 " {\n" 674 " bActive = GroupsActive[inner];\n" 675 " }\n" 676 " }\n" 677 " if(bActive)\n" 678 " {\n" 679 " elem.style[\'text-decoration\'] = \'underline\';\n" 680 " }\n" 681 " else\n" 682 " {\n" 683 " elem.style[\'text-decoration\'] = \'none\';\n" 684 " }\n" 685 " }\n" 686 "}\n" 687 "function CategoryIndex(CategoryName)\n" 688 "{\n" 689 " for(var i = 0; i < CategoryInfo.length; ++i)\n" 690 " {\n" 691 " if(CategoryInfo[i] == CategoryName)\n" 692 " {\n" 693 " return i;\n" 694 " }\n" 695 " }\n" 696 " return -1;\n" 697 "}\n" 698 "function IsCategoryActive(CategoryIdx)\n" 699 "{\n" 700 " for(var i = 0; i < GroupInfo.length; ++i)\n" 701 " {\n" 702 " if(GroupInfo[i].category == CategoryIdx)\n" 703 " {\n" 704 " var Name = GroupInfo[i].name;\n" 705 " if(!GroupsActive[Name])\n" 706 " {\n" 707 " return false;\n" 708 " }\n" 709 " }\n" 710 " }\n" 711 " return true;\n" 712 "\n" 713 "}\n" 714 "function ToggleCategory(CategoryName)\n" 715 "{\n" 716 " var CategoryIdx = CategoryIndex(CategoryName);\n" 717 " if(CategoryIdx < 0)\n" 718 " return;\n" 719 " var CategoryActive = IsCategoryActive(CategoryIdx);\n" 720 " for(var i = 0; i < GroupInfo.length; ++i)\n" 721 " {\n" 722 " if(GroupInfo[i].category == CategoryIdx)\n" 723 " {\n" 724 " var Name = GroupInfo[i].name;\n" 725 " if(CategoryActive)\n" 726 " {\n" 727 " GroupsActive[Name] = false;\n" 728 " }\n" 729 " else\n" 730 " {\n" 731 " GroupsActive[Name] = true;\n" 732 " }\n" 733 " }\n" 734 " }\n" 735 " UpdateGroupMenu();\n" 736 " WriteCookie();\n" 737 " RequestRedraw();\n" 738 "}\n" 739 "\n" 740 "function ToggleGroup(GroupName)\n" 741 "{\n" 742 " if(GroupName)\n" 743 " {\n" 744 " if(GroupsActive[GroupName])\n" 745 " {\n" 746 " GroupsActive[GroupName] = false;\n" 747 " }\n" 748 " else\n" 749 " {\n" 750 " GroupsActive[GroupName] = true;\n" 751 " }\n" 752 " }\n" 753 " else\n" 754 " {\n" 755 " if(GroupsAllActive)\n" 756 " {\n" 757 " GroupsAllActive = 0;\n" 758 " }\n" 759 " else\n" 760 " {\n" 761 " GroupsAllActive = 1;\n" 762 " }\n" 763 " }\n" 764 " UpdateGroupMenu();\n" 765 " WriteCookie();\n" 766 " RequestRedraw();\n" 767 "}\n" 768 "function UpdateGroupColors()\n" 769 "{\n" 770 " for(var i = 0; i < TimerInfo.length; ++i)\n" 771 " {\n" 772 " if(GroupColors)\n" 773 " {\n" 774 " TimerInfo[i].color = GroupInfo[TimerInfo[i].group].color;\n" 775 " }\n" 776 " else\n" 777 " {\n" 778 " TimerInfo[i].color = TimerInfo[i].timercolor;\n" 779 " }\n" 780 " TimerInfo[i].textcolorindex = InvertColorIndex(TimerInfo[i].color);\n" 781 " }\n" 782 "}\n" 783 "\n" 784 "function ToggleGroupColors()\n" 785 "{\n" 786 " GroupColors = !GroupColors;\n" 787 " UpdateGroupColors();\n" 788 " UpdateOptionsMenu();\n" 789 " WriteCookie();\n" 790 " RequestRedraw();\n" 791 "}\n" 792 "\n" 793 "function UpdateOptionsMenu()\n" 794 "{\n" 795 " var ulTimersMeta = document.getElementById(\'TimersMeta\');\n" 796 " ulTimersMeta.style[\'text-decoration\'] = TimersMeta ? \'underline\' : \'none\';\n" 797 " var ulGroupColors = document.getElementById(\'GroupColors\');\n" 798 " ulGroupColors.style[\'text-decoration\'] = GroupColors ? \'underline\' : \'none\';\n" 799 "}\n" 800 "\n" 801 "function ToggleTimersMeta()\n" 802 "{\n" 803 " TimersMeta = TimersMeta ? 0 : 1;\n" 804 " WriteCookie();\n" 805 " UpdateOptionsMenu();\n" 806 " RequestRedraw();\n" 807 "}\n" 808 "\n" 809 "function ShowHelp(Show, Forever)\n" 810 "{\n" 811 " var HelpWindow = document.getElementById(\'helpwindow\');\n" 812 " if(Show)\n" 813 " {\n" 814 " HelpWindow.style[\'display\'] = \'block\';\n" 815 " }\n" 816 " else\n" 817 " {\n" 818 " HelpWindow.style[\'display\'] = \'none\';\n" 819 " }\n" 820 " if(Forever)\n" 821 " {\n" 822 " nHideHelp = Show ? 0 : 1;\n" 823 " WriteCookie();\n" 824 " }\n" 825 "}\n" 826 "function SetMode(NewMode, Groups)\n" 827 "{\n" 828 " var buttonTimers = document.getElementById(\'buttonTimers\');\n" 829 " var buttonDetailed = document.getElementById(\'buttonDetailed\');\n" 830 " var buttonGroups = document.getElementById(\'buttonGroups\');\n" 831 " var buttonThreads = document.getElementById(\'buttonThreads\');\n" 832 " var ilThreads = document.getElementById(\'ilThreads\');\n" 833 " var ilGroups = document.getElementById(\'ilGroups\');\n" 834 " var ModeElement = null;\n" 835 " if(NewMode == \'timers\' || NewMode == ModeTimers)\n" 836 " {\n" 837 " TimersGroups = Groups;\n" 838 " buttonTimers.style[\'text-decoration\'] = TimersGroups ? \'none\' : \'underline\';\n" 839 " buttonGroups.style[\'text-decoration\'] = TimersGroups == 1 ? \'underline\' : \'none\';\n" 840 " buttonThreads.style[\'text-decoration\'] = TimersGroups == 2 ? \'underline\' : \'none\';\n" 841 " buttonDetailed.style[\'text-decoration\'] = \'none\';\n" 842 " if(TimersGroups == 0)\n" 843 " {\n" 844 " ilThreads.style[\'display\'] = \'none\';\n" 845 " }\n" 846 " else\n" 847 " {\n" 848 " ilThreads.style[\'display\'] = \'block\';\n" 849 " }\n" 850 " ilGroups.style[\'display\'] = \'block\';\n" 851 " Mode = ModeTimers;\n" 852 " ModeElement = TimersGroups == 2 ? buttonThreads : TimersGroups == 1 ? buttonGroups : buttonTimers;\n" 853 " }\n" 854 " else if(NewMode == \'detailed\' || NewMode == ModeDetailed)\n" 855 " {\n" 856 " buttonTimers.style[\'text-decoration\'] = \'none\';\n" 857 " buttonGroups.style[\'text-decoration\'] = \'none\';\n" 858 " buttonThreads.style[\'text-decoration\'] = \'none\';\n" 859 " buttonDetailed.style[\'text-decoration\'] = \'underline\';\n" 860 " ilThreads.style[\'display\'] = \'block\';\n" 861 " ilGroups.style[\'display\'] = \'none\';\n" 862 " Mode = ModeDetailed;\n" 863 " ModeElement = buttonDetailed;\n" 864 " }\n" 865 " var ModeSubMenuText = document.getElementById(\'ModeSubMenuText\');\n" 866 " ModeSubMenuText.innerText = \'Mode[\' + ModeElement.innerText + \']\';\n" 867 "\n" 868 " WriteCookie();\n" 869 " RequestRedraw();\n" 870 "\n" 871 "}\n" 872 "\n" 873 "function SetReferenceTime(TimeString)\n" 874 "{\n" 875 " ReferenceTime = parseInt(TimeString);\n" 876 " var ReferenceMenu = document.getElementById(\'ReferenceSubMenu\');\n" 877 " var Links = ReferenceMenu.getElementsByTagName(\'a\');\n" 878 " for(var i = 0; i < Links.length; ++i)\n" 879 " {\n" 880 " if(Links[i].innerHTML.match(\'^\' + TimeString))\n" 881 " {\n" 882 " Links[i].style[\'text-decoration\'] = \'underline\';\n" 883 " }\n" 884 " else\n" 885 " {\n" 886 " Links[i].style[\'text-decoration\'] = \'none\';\n" 887 " }\n" 888 " }\n" 889 " WriteCookie();\n" 890 " RequestRedraw();\n" 891 "\n" 892 "}\n" 893 "\n" 894 "function ToggleContextSwitch()\n" 895 "{\n" 896 " SetContextSwitch(nContextSwitchEnabled ? 0 : 1);\n" 897 "}\n" 898 "function SetContextSwitch(Enabled)\n" 899 "{\n" 900 " nContextSwitchEnabled = Enabled ? 1 : 0;\n" 901 " var ReferenceMenu = document.getElementById(\'OptionsMenu\');\n" 902 " var Links = ReferenceMenu.getElementsByTagName(\'a\');\n" 903 " Links[0].style[\'text-decoration\'] = nContextSwitchEnabled ? \'underline\' : \'none\';\n" 904 " WriteCookie();\n" 905 " RequestRedraw();\n" 906 "}\n" 907 "\n" 908 "function ToggleDebug()\n" 909 "{\n" 910 " Debug = (Debug + 1) % 2;\n" 911 "}\n" 912 "\n" 913 "function ToggleDisableMerge()\n" 914 "{\n" 915 " DisableMerge = DisableMerge ? 0 : 1;\n" 916 " var ReferenceMenu = document.getElementById(\'OptionsMenu\');\n" 917 " var Links = ReferenceMenu.getElementsByTagName(\'a\');\n" 918 " if(DisableMerge)\n" 919 " {\n" 920 " Links[1].style[\'text-decoration\'] = \'underline\';\n" 921 " }\n" 922 " else\n" 923 " {\n" 924 " Links[1].style[\'text-decoration\'] = \'none\';\n" 925 " }\n" 926 "\n" 927 "}\n" 928 "\n" 929 "function ToggleDisableLod()\n" 930 "{\n" 931 " DisableLod = DisableLod ? 0 : 1;\n" 932 " var ReferenceMenu = document.getElementById(\'OptionsMenu\');\n" 933 " var Links = ReferenceMenu.getElementsByTagName(\'a\');\n" 934 " if(DisableLod)\n" 935 " {\n" 936 " Links[2].style[\'text-decoration\'] = \'underline\';\n" 937 " }\n" 938 " else\n" 939 " {\n" 940 " Links[2].style[\'text-decoration\'] = \'none\';\n" 941 " }\n" 942 "\n" 943 "}\n" 944 "\n" 945 "function GatherHoverMetaCounters(TimerIndex, StartIndex, nLog, nFrameLast)\n" 946 "{\n" 947 " var HoverInfo = new Object();\n" 948 " var StackPos = 1;\n" 949 " //search backwards, count meta counters \n" 950 " for(var i = nFrameLast; i >= 0; i--)\n" 951 " {\n" 952 " var fr = Frames[i];\n" 953 " var ts = fr.ts[nLog];\n" 954 " var ti = fr.ti[nLog];\n" 955 " var tt = fr.tt[nLog];\n" 956 " var start = i == nFrameLast ? StartIndex-1 : ts.length-1;\n" 957 "\n" 958 " for(var j = start; j >= 0; j--)\n" 959 " {\n" 960 " var type = tt[j];\n" 961 " var index = ti[j];\n" 962 " var time = ts[j];\n" 963 " if(type == 1)\n" 964 " {\n" 965 " StackPos--;\n" 966 " if(StackPos == 0 && index == TimerIndex)\n" 967 " {\n" 968 " return HoverInfo;\n" 969 " }\n" 970 " }\n" 971 " else if(type == 0)\n" 972 " {\n" 973 " StackPos++;\n" 974 " }\n" 975 " else if(type > 3)\n" 976 " {\n" 977 " var nMetaCount = type - 3;\n" 978 " var nMetaIndex = MetaNames[index];\n" 979 " if(nMetaIndex in HoverInfo)\n" 980 " {\n" 981 " HoverInfo[nMetaIndex] += nMetaCount;\n" 982 " }\n" 983 " else\n" 984 " {\n" 985 " HoverInfo[nMetaIndex] = nMetaCount;\n" 986 " }\n" 987 " }\n" 988 " }\n" 989 " }\n" 990 "}\n" 991 "function CalculateAllTimers(fBegin, fEnd)\n" 992 "{\n" 993 " var Sum = [];\n" 994 " var Count = [];\n" 995 " var Sorted = [];\n" 996 " for(var i = 0; i < TimerInfo.length; ++i)\n" 997 " {\n" 998 " Sum.push(0.0);\n" 999 " Count.push(0);\n" 1000 " Sorted.push(i);\n" 1001 " }\n" 1002 " var nFrameFirst = 0;\n" 1003 " var nFrameLast = Frames.length;\n" 1004 "\n" 1005 " var nNumLogs = Frames[0].ts.length;\n" 1006 " var StackPosArray = Array(nNumLogs);\n" 1007 " var StackArray = Array(nNumLogs);\n" 1008 " for(var i = 0; i < nNumLogs; ++i)\n" 1009 " {\n" 1010 " StackPosArray[i] = 0;\n" 1011 " StackArray[i] = Array(20);\n" 1012 " }\n" 1013 "\n" 1014 " for(var i = nFrameFirst; i < nFrameLast; i++)\n" 1015 " {\n" 1016 " var fr = Frames[i];\n" 1017 " for(nLog = 0; nLog < nNumLogs; nLog++)\n" 1018 " {\n" 1019 " var StackPos = StackPosArray[nLog];\n" 1020 " var Stack = StackArray[nLog];\n" 1021 " var ts = fr.ts[nLog];\n" 1022 " var ti = fr.ti[nLog];\n" 1023 " var tt = fr.tt[nLog];\n" 1024 " var count = ts.length;\n" 1025 " for(j = 0; j < count; j++)\n" 1026 " {\n" 1027 " var type = tt[j];\n" 1028 " var index = ti[j];\n" 1029 " var time = ts[j];\n" 1030 " if(type == 1 && time < fEnd) //enter\n" 1031 " {\n" 1032 " Stack[StackPos] = time < fBegin ? fBegin : time;\n" 1033 " if(StackArray[nLog][StackPos] != time)\n" 1034 " {\n" 1035 " console.log(\'fail fail fail\');\n" 1036 " }\n" 1037 " StackPos++;\n" 1038 " }\n" 1039 " else if(type == 0) // leave\n" 1040 " {\n" 1041 " if(StackPos>0)\n" 1042 " {\n" 1043 " var timeend = time;\n" 1044 " StackPos--;\n" 1045 " timestart = Stack[StackPos];\n" 1046 " var TimeDelta = timeend - timestart;\n" 1047 " Sum[index] += TimeDelta;\n" 1048 " Count[index]++;\n" 1049 " }\n" 1050 " }\n" 1051 " }\n" 1052 " StackPosArray[nLog] = StackPos;\n" 1053 " }\n" 1054 " }\n" 1055 " Sorted.sort(function(a,b){ return Sum[b] - Sum[a]; } );\n" 1056 " var Result = {\"Sorted\" : Sorted, \"Sum\" : Sum, \"Count\" : Count};\n" 1057 " return Result;\n" 1058 "}\n" 1059 "function CalculateTimers(Result, TimerIndex, nFrameFirst, nFrameLast)\n" 1060 "{\n" 1061 " if(!nFrameFirst || nFrameFirst < 0)\n" 1062 " nFrameFirst = 0;\n" 1063 " if(!nFrameLast || nFrameLast > Frames.length)\n" 1064 " nFrameLast = Frames.length;\n" 1065 " var FrameCount = nFrameLast - nFrameFirst;\n" 1066 " if(0 == FrameCount)\n" 1067 " return;\n" 1068 " var CallCount = 0;\n" 1069 " var Sum = 0;\n" 1070 " var Max = 0;\n" 1071 " var FrameMax = 0;\n" 1072 "\n" 1073 " var nNumLogs = Frames[0].ts.length;\n" 1074 " var StackPosArray = Array(nNumLogs);\n" 1075 " var StackArray = Array(nNumLogs);\n" 1076 " for(var i = 0; i < nNumLogs; ++i)\n" 1077 " {\n" 1078 " StackPosArray[i] = 0;\n" 1079 " StackArray[i] = Array(20);\n" 1080 " }\n" 1081 "\n" 1082 " for(var i = nFrameFirst; i < nFrameLast; i++)\n" 1083 " {\n" 1084 " var FrameSum = 0;\n" 1085 " var fr = Frames[i];\n" 1086 " for(nLog = 0; nLog < nNumLogs; nLog++)\n" 1087 " {\n" 1088 " var StackPos = StackPosArray[nLog];\n" 1089 " var Stack = StackArray[nLog];\n" 1090 " var ts = fr.ts[nLog];\n" 1091 " var ti = fr.ti[nLog];\n" 1092 " var tt = fr.tt[nLog];\n" 1093 " var count = ts.length;\n" 1094 " for(j = 0; j < count; j++)\n" 1095 " {\n" 1096 " var type = tt[j];\n" 1097 " var index = ti[j];\n" 1098 " var time = ts[j];\n" 1099 " if(type == 1) //enter\n" 1100 " {\n" 1101 " //push\n" 1102 " Stack[StackPos] = time;\n" 1103 " if(StackArray[nLog][StackPos] != time)\n" 1104 " {\n" 1105 " console.log(\'fail fail fail\');\n" 1106 " }\n" 1107 " StackPos++;\n" 1108 " }\n" 1109 " else if(type == 0) // leave\n" 1110 " {\n" 1111 " var timestart;\n" 1112 " var timeend = time;\n" 1113 " if(StackPos>0)\n" 1114 " {\n" 1115 " StackPos--;\n" 1116 " timestart = Stack[StackPos];\n" 1117 " }\n" 1118 " else\n" 1119 " {\n" 1120 " timestart = Frames[nFrameFirst].framestart;\n" 1121 " }\n" 1122 " if(index == TimerIndex)\n" 1123 " {\n" 1124 " var TimeDelta = timeend - timestart;\n" 1125 " CallCount++;\n" 1126 " FrameSum += TimeDelta;\n" 1127 " Sum += TimeDelta;\n" 1128 " if(TimeDelta > Max)\n" 1129 " Max = TimeDelta;\n" 1130 " }\n" 1131 " }\n" 1132 " else\n" 1133 " {\n" 1134 " //meta\n" 1135 " }\n" 1136 " }\n" 1137 " if(FrameSum > FrameMax)\n" 1138 " {\n" 1139 " FrameMax = FrameSum;\n" 1140 " }\n" 1141 " StackPosArray[nLog] = StackPos;\n" 1142 " }\n" 1143 " }\n" 1144 "\n" 1145 " Result.CallCount = CallCount;\n" 1146 " Result.Sum = Sum.toFixed(3);\n" 1147 " Result.Max = Max.toFixed(3);\n" 1148 " Result.Average = (Sum / CallCount).toFixed(3);\n" 1149 " Result.FrameAverage = (Sum / FrameCount).toFixed(3);\n" 1150 " Result.FrameCallAverage = (CallCount / FrameCount).toFixed(3);\n" 1151 " Result.FrameMax = FrameMax.toFixed(3);\n" 1152 " return Result;\n" 1153 "}\n" 1154 "\n" 1155 "function PreprocessCalculateAllTimers()\n" 1156 "{\n" 1157 " ProfileEnter(\"CalculateAllTimers\");\n" 1158 " var nFrameFirst = 0;\n" 1159 " var nFrameLast = Frames.length;\n" 1160 " var FrameCount = nFrameLast - nFrameFirst;\n" 1161 " if(0 == FrameCount)\n" 1162 " return;\n" 1163 " for(var j = 0; j < TimerInfo.length; j++)\n" 1164 " {\n" 1165 " TimerInfo[j].CallCount = 0;\n" 1166 " TimerInfo[j].Sum = 0;\n" 1167 " TimerInfo[j].Max = 0;\n" 1168 " TimerInfo[j].FrameMax = 0;\n" 1169 " }\n" 1170 "\n" 1171 "\n" 1172 " var nNumLogs = Frames[0].ts.length;\n" 1173 " var StackPosArray = Array(nNumLogs);\n" 1174 " var StackArray = Array(nNumLogs);\n" 1175 " for(var i = 0; i < nNumLogs; ++i)\n" 1176 " {\n" 1177 " StackPosArray[i] = 0;\n" 1178 " StackArray[i] = Array(20);\n" 1179 " }\n" 1180 "\n" 1181 " for(var i = nFrameFirst; i < nFrameLast; i++)\n" 1182 " {\n" 1183 " for(var j = 0; j < TimerInfo.length; j++)\n" 1184 " {\n" 1185 " TimerInfo[j].FrameSum = 0;\n" 1186 " }\n" 1187 "\n" 1188 " var fr = Frames[i];\n" 1189 " for(nLog = 0; nLog < nNumLogs; nLog++)\n" 1190 " {\n" 1191 " var StackPos = StackPosArray[nLog];\n" 1192 " var Stack = StackArray[nLog];\n" 1193 " var ts = fr.ts[nLog];\n" 1194 " var ti = fr.ti[nLog];\n" 1195 " var tt = fr.tt[nLog];\n" 1196 " var count = ts.length;\n" 1197 " for(j = 0; j < count; j++)\n" 1198 " {\n" 1199 " var type = tt[j];\n" 1200 " var index = ti[j];\n" 1201 " var time = ts[j];\n" 1202 " if(type == 1) //enter\n" 1203 " {\n" 1204 " //push\n" 1205 " Stack[StackPos] = time;\n" 1206 " if(StackArray[nLog][StackPos] != time)\n" 1207 " {\n" 1208 " console.log(\'fail fail fail\');\n" 1209 " }\n" 1210 " StackPos++;\n" 1211 " }\n" 1212 " else if(type == 0) // leave\n" 1213 " {\n" 1214 " var timestart;\n" 1215 " var timeend = time;\n" 1216 " if(StackPos>0)\n" 1217 " {\n" 1218 " StackPos--;\n" 1219 " timestart = Stack[StackPos];\n" 1220 " }\n" 1221 " else\n" 1222 " {\n" 1223 " timestart = Frames[nFrameFirst].framestart;\n" 1224 " }\n" 1225 " // if(index == TimerIndex)\n" 1226 " {\n" 1227 " var TimeDelta = timeend - timestart;\n" 1228 " TimerInfo[index].CallCount++;\n" 1229 " TimerInfo[index].FrameSum += TimeDelta;\n" 1230 " TimerInfo[index].Sum += TimeDelta;\n" 1231 " if(TimeDelta > TimerInfo[index].Max)\n" 1232 " TimerInfo[index].Max = TimeDelta;\n" 1233 " }\n" 1234 " }\n" 1235 " else\n" 1236 " {\n" 1237 " //meta\n" 1238 " }\n" 1239 " }\n" 1240 " for(var j = 0; j < TimerInfo.length; j++)\n" 1241 " {\n" 1242 " if(TimerInfo[j].FrameSum > TimerInfo[j].FrameMax)\n" 1243 " {\n" 1244 " TimerInfo[j].FrameMax = TimerInfo[j].FrameSum;\n" 1245 " }\n" 1246 " }\n" 1247 " StackPosArray[nLog] = StackPos;\n" 1248 " }\n" 1249 "\n" 1250 "\n" 1251 " }\n" 1252 "\n" 1253 " for(var j = 0; j < TimerInfo.length; j++)\n" 1254 " {\n" 1255 " var CallCount = TimerInfo[j].CallCount;\n" 1256 " var Sum = TimerInfo[j].Sum.toFixed(3);\n" 1257 " var Max = TimerInfo[j].Max.toFixed(3);\n" 1258 " var Average = (TimerInfo[j].Sum / TimerInfo[j].CallCount).toFixed(3);\n" 1259 " var FrameAverage = (TimerInfo[j].Sum / FrameCount).toFixed(3);\n" 1260 " var FrameCallAverage = (TimerInfo[j].CallCount / FrameCount).toFixed(3);\n" 1261 " var FrameMax = TimerInfo[j].FrameMax.toFixed(3);\n" 1262 " TimerInfo[j].CallCount = CallCount;\n" 1263 " TimerInfo[j].Sum = Sum;\n" 1264 " TimerInfo[j].Max = Max ;\n" 1265 " TimerInfo[j].Average = Average;\n" 1266 " TimerInfo[j].FrameAverage = FrameAverage;\n" 1267 " TimerInfo[j].FrameCallAverage = FrameCallAverage;\n" 1268 " TimerInfo[j].FrameMax = FrameMax;\n" 1269 " }\n" 1270 " ProfileLeave();\n" 1271 "}\n" 1272 "\n" 1273 "var FlashFrames = 10;\n" 1274 "var FlashFrameCounter = 0;\n" 1275 "var FlashMessage = \'\';\n" 1276 "function TimeString(Diff)\n" 1277 "{\n" 1278 " var DiffString = \"0 sec\";\n" 1279 " var DiffTable = [1,60,60*60,60*60*24];\n" 1280 " var DiffNameTable = [\"sec\", \"min\", \"hr\", \"day\"];\n" 1281 " for(var i = 0; i < DiffTable.length; ++i)\n" 1282 " {\n" 1283 " if(Diff >= DiffTable[i])\n" 1284 " {\n" 1285 " DiffString = Math.floor(Diff / DiffTable[i]) + \" \" + DiffNameTable[i];\n" 1286 " }\n" 1287 " }\n" 1288 " return DiffString;\n" 1289 "\n" 1290 "}\n" 1291 "function ShowFlashMessage(Message, FrameCount)\n" 1292 "{\n" 1293 " FlashMessage = Message;\n" 1294 " FlashFrameCounter = FrameCount;\n" 1295 "}\n" 1296 "function OnPageReady()\n" 1297 "{\n" 1298 " var DumpDate = DumpUtcCaptureTime;\n" 1299 " var CurrentDate = Date.now() / 1000;\n" 1300 " var Diff = CurrentDate - DumpDate;\n" 1301 " var Limit = 10*60;//flash old message when loading captures older than 10 minutes \n" 1302 " if(Diff > Limit)\n" 1303 " {\n" 1304 " ShowFlashMessage(\"Captured \" + TimeString(Diff) + \" ago\", 100);\n" 1305 " }\n" 1306 " if(!nHideHelp)\n" 1307 " {\n" 1308 " ShowHelp(1,0);\n" 1309 " }\n" 1310 "}\n" 1311 "\n" 1312 "function DrawFlashMessage(context)\n" 1313 "{\n" 1314 " if(FlashFrameCounter > 0)\n" 1315 " {\n" 1316 " if(FlashFrameCounter>1)\n" 1317 " {\n" 1318 " var FlashPrc = Math.sin(FlashFrameCounter / FlashFrames);\n" 1319 " context.font = FontFlash;\n" 1320 " context.globalAlpha = FlashPrc * 0.35 + 0.5;\n" 1321 " context.textAlign = \'center\';\n" 1322 " context.fillStyle = \'red\';\n" 1323 " context.fillText(FlashMessage, nWidth * 0.5, 50);\n" 1324 " context.globalAlpha = 1;\n" 1325 " context.textAlign = \'left\';\n" 1326 " context.font = Font;\n" 1327 " }\n" 1328 " FlashFrameCounter -= 1;\n" 1329 "\n" 1330 " }\n" 1331 "}\n" 1332 "\n" 1333 "function DrawCaptureInfo(context)\n" 1334 "{\n" 1335 " context.fillStyle = \'white\';\n" 1336 " context.textAlign = \'right\';\n" 1337 " context.font = Font;\n" 1338 " var DumpDate = DumpUtcCaptureTime;\n" 1339 " var CurrentDate = Date.now() / 1000;\n" 1340 " var Diff = CurrentDate - DumpDate;\n" 1341 " var DiffString = TimeString(Diff) + \" ago\";\n" 1342 " context.fillText(new Date(DumpDate*1000).toLocaleString(), nWidth, FontHeight);\n" 1343 " if(Mode == ModeTimers)\n" 1344 " {\n" 1345 " context.fillText(\"Timer Frames: \" + AggregateInfo.Frames, nWidth, FontHeight*2);\n" 1346 " }\n" 1347 " else\n" 1348 " {\n" 1349 " context.fillText(\"Detailed Frames \"+ Frames.length, nWidth, FontHeight*2);\n" 1350 " }\n" 1351 " context.fillText(DumpHost, nWidth, FontHeight*3);\n" 1352 " context.fillText(DiffString, nWidth, FontHeight*4);\n" 1353 " context.textAlign = \'left\';\n" 1354 " DrawFlashMessage(context);\n" 1355 "}\n" 1356 "\n" 1357 "function DrawDetailedFrameHistory()\n" 1358 "{\n" 1359 " ProfileEnter(\"DrawDetailedFrameHistory\");\n" 1360 " var x = HistoryViewMouseX;\n" 1361 "\n" 1362 " var context = CanvasHistory.getContext(\'2d\');\n" 1363 " context.clearRect(0, 0, CanvasHistory.width, CanvasHistory.height);\n" 1364 "\n" 1365 " var fHeight = nHistoryHeight;\n" 1366 " var fWidth = nWidth / Frames.length;\n" 1367 " var fHeightScale = fHeight / ReferenceTime;\n" 1368 " var fX = 0;\n" 1369 " var FrameIndex = -1;\n" 1370 " var MouseDragging = MouseDragState != MouseDragOff;\n" 1371 " fRangeBeginHistory = fRangeEndHistory = -1;\n" 1372 " fRangeBeginHistoryGpu = fRangeEndHistoryGpu = -1;\n" 1373 "\n" 1374 " var FrameFirst = -1;\n" 1375 " var FrameLast = nWidth;\n" 1376 " var fDetailedOffsetEnd = fDetailedOffset + fDetailedRange;\n" 1377 " for(i = 0; i < Frames.length; i++)\n" 1378 " {\n" 1379 " var fMs = Frames[i].frameend - Frames[i].framestart;\n" 1380 " if(fDetailedOffset <= Frames[i].frameend && fDetailedOffset >= Frames[i].framestart)\n" 1381 " {\n" 1382 " var lerp = (fDetailedOffset - Frames[i].framestart) / (Frames[i].frameend - Frames[i].framestart);\n" 1383 " FrameFirst = fX + fWidth * lerp;\n" 1384 " }\n" 1385 " if(fDetailedOffsetEnd <= Frames[i].frameend && fDetailedOffsetEnd >= Frames[i].framestart)\n" 1386 " {\n" 1387 " var lerp = (fDetailedOffsetEnd - Frames[i].framestart) / (Frames[i].frameend - Frames[i].framestart);\n" 1388 " FrameLast = fX + fWidth * lerp;\n" 1389 " }\n" 1390 " var fH = fHeightScale * fMs;\n" 1391 " var bMouse = x > fX && x < fX + fWidth;\n" 1392 " if(bMouse && !MouseDragging)\n" 1393 " {\n" 1394 " context.fillStyle = FRAME_HISTORY_COLOR_GPU;\n" 1395 " fRangeBeginHistory = Frames[i].framestart;\n" 1396 " fRangeEndHistory = Frames[i].frameend;\n" 1397 " if(Frames[i].framestartgpu)\n" 1398 " {\n" 1399 " fRangeBeginHistoryGpu = Frames[i].framestartgpu;\n" 1400 " fRangeEndHistoryGpu = Frames[i].frameendgpu;\n" 1401 " }\n" 1402 " FrameIndex = i;\n" 1403 " }\n" 1404 " else\n" 1405 " {\n" 1406 " context.fillStyle = FRAME_HISTORY_COLOR_CPU;\n" 1407 " }\n" 1408 " context.fillRect(fX, fHeight - fH, fWidth-1, fH);\n" 1409 " fX += fWidth;\n" 1410 " }\n" 1411 "\n" 1412 " var fRangeHistoryBegin = FrameFirst;\n" 1413 " var fRangeHistoryEnd = FrameLast;\n" 1414 " var X = fRangeHistoryBegin;\n" 1415 " var Y = 0;\n" 1416 " var W = fRangeHistoryEnd - fRangeHistoryBegin;\n" 1417 " context.globalAlpha = 0.35;\n" 1418 " context.fillStyle = \'#009900\';\n" 1419 " context.fillRect(X, Y, W, fHeight);\n" 1420 " context.globalAlpha = 1;\n" 1421 " context.strokeStyle = \'#00ff00\';\n" 1422 " context.beginPath();\n" 1423 " context.moveTo(X, Y);\n" 1424 " context.lineTo(X, Y+fHeight);\n" 1425 " context.moveTo(X+W, Y);\n" 1426 " context.lineTo(X+W, Y+fHeight);\n" 1427 " context.stroke();\n" 1428 "\n" 1429 "\n" 1430 "\n" 1431 "\n" 1432 " DrawCaptureInfo(context);\n" 1433 "\n" 1434 " if(FrameIndex>=0 && !MouseDragging)\n" 1435 " {\n" 1436 " var StringArray = [];\n" 1437 " StringArray.push(\"Frame\");\n" 1438 " StringArray.push(\"\" + FrameIndex);\n" 1439 " StringArray.push(\"Time\");\n" 1440 " StringArray.push(\"\" + (Frames[FrameIndex].frameend - Frames[FrameIndex].framestart).toFixed(3));\n" 1441 "\n" 1442 " DrawToolTip(StringArray, CanvasHistory, HistoryViewMouseX, HistoryViewMouseY+20);\n" 1443 "\n" 1444 " }\n" 1445 " ProfileLeave();\n" 1446 "}\n" 1447 "function TimeToMsString(Time)\n" 1448 "{\n" 1449 " return Time.toFixed(3) + \"ms\";\n" 1450 "}\n" 1451 "function TimeToString(Time)\n" 1452 "{\n" 1453 " if(Time > 1000)\n" 1454 " {\n" 1455 " return (Time/1000.0).toFixed(0) +\"s\";\n" 1456 " }\n" 1457 " else if(Time > 0.9)\n" 1458 " {\n" 1459 " return Time.toFixed(0) + \"ms\";\n" 1460 " }\n" 1461 " else if(Time > 0.0009)\n" 1462 " {\n" 1463 " return (Time*1000).toFixed(0) + \"us\";\n" 1464 " }\n" 1465 " else\n" 1466 " {\n" 1467 " return (Time*1000000).toFixed(0) + \"ns\";\n" 1468 " }\n" 1469 "}\n" 1470 "\n" 1471 "function DrawDetailedBackground(context)\n" 1472 "{\n" 1473 " var fMs = fDetailedRange;\n" 1474 " var fMsEnd = fMs + fDetailedOffset;\n" 1475 " var fMsToScreen = nWidth / fMs;\n" 1476 " var fRate = Math.floor(2*((Math.log(fMs)/Math.log(10))-1))/2;\n" 1477 " var fStep = Math.pow(10, fRate);\n" 1478 " var fRcpStep = 1.0 / fStep;\n" 1479 " var nColorIndex = Math.floor(fDetailedOffset * fRcpStep) % 2;\n" 1480 " if(nColorIndex < 0)\n" 1481 " nColorIndex = -nColorIndex;\n" 1482 " var fStart = Math.floor(fDetailedOffset * fRcpStep) * fStep;\n" 1483 " var fHeight = CanvasDetailedView.height;\n" 1484 " var fScaleX = nWidth / fDetailedRange; \n" 1485 " var HeaderString = TimeToString(fStep);\n" 1486 " context.textAlign = \'center\';\n" 1487 " for(f = fStart; f < fMsEnd; )\n" 1488 " {\n" 1489 " var fNext = f + fStep;\n" 1490 " var X = (f - fDetailedOffset) * fScaleX;\n" 1491 " var W = (fNext-f)*fScaleX;\n" 1492 " context.fillStyle = nBackColors[nColorIndex];\n" 1493 " context.fillRect(X, 0, W+2, fHeight);\n" 1494 " nColorIndex = 1 - nColorIndex;\n" 1495 " context.fillStyle = \'#777777\'\n" 1496 " context.fillText(HeaderString, X + W * 0.5, 10);\n" 1497 " context.fillText(HeaderString, X + W * 0.5, nHeight - 10);\n" 1498 " f = fNext;\n" 1499 " }\n" 1500 " context.textAlign = \'left\';\n" 1501 " var fScaleX = nWidth / fDetailedRange; \n" 1502 " context.globalAlpha = 0.5;\n" 1503 " context.strokeStyle = \'#bbbbbb\';\n" 1504 " context.beginPath();\n" 1505 " for(var i = 0; i < Frames.length; i++)\n" 1506 " {\n" 1507 " var frfr = Frames[i];\n" 1508 " if(frfr.frameend < fDetailedOffset || frfr.framestart > fDetailedOffset + fDetailedRange)\n" 1509 " {\n" 1510 " continue;\n" 1511 " }\n" 1512 " var X = (frfr.framestart - fDetailedOffset) * fScaleX;\n" 1513 " if(X >= 0 && X < nWidth)\n" 1514 " {\n" 1515 " context.moveTo(X, 0);\n" 1516 " context.lineTo(X, nHeight);\n" 1517 " }\n" 1518 " }\n" 1519 " context.stroke();\n" 1520 " context.globalAlpha = 1;\n" 1521 "\n" 1522 "}\n" 1523 "function DrawToolTip(StringArray, Canvas, x, y)\n" 1524 "{\n" 1525 " var context = Canvas.getContext(\'2d\');\n" 1526 " context.font = Font;\n" 1527 " var WidthArray = Array(StringArray.length);\n" 1528 " var nMaxWidth = 0;\n" 1529 " var nHeight = 0;\n" 1530 " for(i = 0; i < StringArray.length; i += 2)\n" 1531 " {\n" 1532 " var nWidth0 = context.measureText(StringArray[i]).width;\n" 1533 " var nWidth1 = context.measureText(StringArray[i+1]).width;\n" 1534 " var nSum = nWidth0 + nWidth1;\n" 1535 " WidthArray[i] = nWidth0;\n" 1536 " WidthArray[i+1] = nWidth1;\n" 1537 " if(nSum > nMaxWidth)\n" 1538 " {\n" 1539 " nMaxWidth = nSum;\n" 1540 " }\n" 1541 " nHeight += BoxHeight;\n" 1542 " }\n" 1543 " nMaxWidth += 15;\n" 1544 " //bounds check.\n" 1545 " var CanvasRect = Canvas.getBoundingClientRect();\n" 1546 " if(y + nHeight > CanvasRect.height)\n" 1547 " {\n" 1548 " y = CanvasRect.height - nHeight;\n" 1549 " x += 20;\n" 1550 " }\n" 1551 " if(x + nMaxWidth > CanvasRect.width)\n" 1552 " {\n" 1553 " x = CanvasRect.width - nMaxWidth;\n" 1554 " }\n" 1555 "\n" 1556 " context.fillStyle = \'black\';\n" 1557 " context.fillRect(x-1, y, nMaxWidth+2, nHeight);\n" 1558 " context.fillStyle = \'white\';\n" 1559 "\n" 1560 " var XPos = x;\n" 1561 " var XPosRight = x + nMaxWidth;\n" 1562 " var YPos = y + BoxHeight-2;\n" 1563 " for(i = 0; i < StringArray.length; i += 2)\n" 1564 " {\n" 1565 " context.fillText(StringArray[i], XPos, YPos);\n" 1566 " context.fillText(StringArray[i+1], XPosRight - WidthArray[i+1], YPos);\n" 1567 " YPos += BoxHeight;\n" 1568 " }\n" 1569 "}\n" 1570 "function DrawHoverToolTip()\n" 1571 "{\n" 1572 " ProfileEnter(\"DrawHoverToolTip\");\n" 1573 " if(nHoverToken != -1)\n" 1574 " {\n" 1575 " var StringArray = [];\n" 1576 " var groupid = TimerInfo[nHoverToken].group;\n" 1577 " StringArray.push(\"Timer\");\n" 1578 " StringArray.push(TimerInfo[nHoverToken].name);\n" 1579 " StringArray.push(\"Group\");\n" 1580 " StringArray.push(GroupInfo[groupid].name);\n" 1581 "\n" 1582 " var bShowTimers = Mode == ModeTimers;\n" 1583 " if(FlipToolTip)\n" 1584 " {\n" 1585 " bShowTimers = !bShowTimers;\n" 1586 " }\n" 1587 " if(bShowTimers)\n" 1588 " {\n" 1589 "\n" 1590 " StringArray.push(\"\");\n" 1591 " StringArray.push(\"\");\n" 1592 " var Timer = TimerInfo[nHoverToken];\n" 1593 " StringArray.push(\"Average\");\n" 1594 " StringArray.push(Timer.average);\n" 1595 " StringArray.push(\"Max\");\n" 1596 " StringArray.push(Timer.max);\n" 1597 " StringArray.push(\"Excl Max\");\n" 1598 " StringArray.push(Timer.exclmax);\n" 1599 " StringArray.push(\"Excl Average\");\n" 1600 " StringArray.push(Timer.exclaverage);\n" 1601 " StringArray.push(\"Call Average\");\n" 1602 " StringArray.push(Timer.callaverage);\n" 1603 " StringArray.push(\"Call Count\");\n" 1604 " StringArray.push(Timer.callcount);\n" 1605 "\n" 1606 " StringArray.push(\"\");\n" 1607 " StringArray.push(\"\");\n" 1608 "\n" 1609 "\n" 1610 " StringArray.push(\"Group\");\n" 1611 " StringArray.push(GroupInfo[groupid].name);\n" 1612 " StringArray.push(\"Average\");\n" 1613 " StringArray.push(GroupInfo[groupid].average);\n" 1614 " StringArray.push(\"Max\");\n" 1615 " StringArray.push(GroupInfo[groupid].max);\n" 1616 "\n" 1617 " StringArray.push(\"\");\n" 1618 " StringArray.push(\"\");\n" 1619 "\n" 1620 " StringArray.push(\""; 1621 1622 const size_t g_MicroProfileHtml_end_0_size = sizeof(g_MicroProfileHtml_end_0); 1623 const char g_MicroProfileHtml_end_1[] = 1624 "Timer Capture\");\n" 1625 " StringArray.push(\"\");\n" 1626 " StringArray.push(\"Frames\");\n" 1627 " StringArray.push(AggregateInfo.Frames);\n" 1628 " StringArray.push(\"Time\");\n" 1629 " StringArray.push(AggregateInfo.Time.toFixed(2) + \"ms\");\n" 1630 "\n" 1631 "\n" 1632 "\n" 1633 "\n" 1634 " }\n" 1635 " else\n" 1636 " {\n" 1637 " StringArray.push(\"\");\n" 1638 " StringArray.push(\"\");\n" 1639 "\n" 1640 "\n" 1641 "\n" 1642 " StringArray.push(\"Time\");\n" 1643 " StringArray.push((fRangeEnd-fRangeBegin).toFixed(3));\n" 1644 " StringArray.push(\"\");\n" 1645 " StringArray.push(\"\");\n" 1646 " StringArray.push(\"Total\");\n" 1647 " StringArray.push(\"\" + TimerInfo[nHoverToken].Sum);\n" 1648 " StringArray.push(\"Max\");\n" 1649 " StringArray.push(\"\" + TimerInfo[nHoverToken].Max);\n" 1650 " StringArray.push(\"Average\");\n" 1651 " StringArray.push(\"\" + TimerInfo[nHoverToken].Average);\n" 1652 " StringArray.push(\"Count\");\n" 1653 " StringArray.push(\"\" + TimerInfo[nHoverToken].CallCount);\n" 1654 "\n" 1655 " StringArray.push(\"\");\n" 1656 " StringArray.push(\"\");\n" 1657 "\n" 1658 " StringArray.push(\"Max/Frame\");\n" 1659 " StringArray.push(\"\" + TimerInfo[nHoverToken].FrameMax);\n" 1660 "\n" 1661 " StringArray.push(\"Average Time/Frame\");\n" 1662 " StringArray.push(\"\" + TimerInfo[nHoverToken].FrameAverage);\n" 1663 "\n" 1664 " StringArray.push(\"Average Count/Frame\");\n" 1665 " StringArray.push(\"\" + TimerInfo[nHoverToken].FrameCallAverage);\n" 1666 "\n" 1667 "\n" 1668 "\n" 1669 "\n" 1670 "\n" 1671 " \n" 1672 " if(nHoverFrame != -1)\n" 1673 " {\n" 1674 " StringArray.push(\"\");\n" 1675 " StringArray.push(\"\");\n" 1676 " StringArray.push(\"Frame \" + nHoverFrame);\n" 1677 " StringArray.push(\"\");\n" 1678 "\n" 1679 " var FrameTime = new Object();\n" 1680 " CalculateTimers(FrameTime, nHoverToken, nHoverFrame, nHoverFrame+1);\n" 1681 " StringArray.push(\"Total\");\n" 1682 " StringArray.push(\"\" + FrameTime.Sum);\n" 1683 " StringArray.push(\"Count\");\n" 1684 " StringArray.push(\"\" + FrameTime.CallCount);\n" 1685 " StringArray.push(\"Average\");\n" 1686 " StringArray.push(\"\" + FrameTime.Average);\n" 1687 " StringArray.push(\"Max\");\n" 1688 " StringArray.push(\"\" + FrameTime.Max);\n" 1689 " }\n" 1690 "\n" 1691 " var HoverInfo = GatherHoverMetaCounters(nHoverToken, nHoverTokenIndex, nHoverTokenLogIndex, nHoverFrame);\n" 1692 " var Header = 0;\n" 1693 " for(index in HoverInfo)\n" 1694 " {\n" 1695 " if(0 == Header)\n" 1696 " {\n" 1697 " Header = 1;\n" 1698 " StringArray.push(\"\");\n" 1699 " StringArray.push(\"\");\n" 1700 " StringArray.push(\"Meta\");\n" 1701 " StringArray.push(\"\");\n" 1702 "\n" 1703 " }\n" 1704 " StringArray.push(\"\"+index);\n" 1705 " StringArray.push(\"\"+HoverInfo[index]);\n" 1706 " }\n" 1707 "\n" 1708 " StringArray.push(\"\");\n" 1709 " StringArray.push(\"\");\n" 1710 "\n" 1711 " StringArray.push(\"Detailed Capture\");\n" 1712 " StringArray.push(\"\");\n" 1713 " StringArray.push(\"Frames\");\n" 1714 " StringArray.push(Frames.length);\n" 1715 " StringArray.push(\"Time\");\n" 1716 " StringArray.push(DetailedTotal().toFixed(2) + \"ms\");\n" 1717 "\n" 1718 "\n" 1719 " }\n" 1720 " DrawToolTip(StringArray, CanvasDetailedView, DetailedViewMouseX, DetailedViewMouseY+20);\n" 1721 " }\n" 1722 " else if(nHoverCSCpu >= 0)\n" 1723 " {\n" 1724 " var StringArray = [];\n" 1725 " StringArray.push(\"Context Switch\");\n" 1726 " StringArray.push(\"\");\n" 1727 " StringArray.push(\"\");\n" 1728 " StringArray.push(\"\");\n" 1729 " StringArray.push(\"Cpu\");\n" 1730 " StringArray.push(\"\" + nHoverCSCpu);\n" 1731 " StringArray.push(\"Begin\");\n" 1732 " StringArray.push(\"\" + fRangeBegin);\n" 1733 " StringArray.push(\"End\");\n" 1734 " StringArray.push(\"\" + fRangeEnd);\n" 1735 " DrawToolTip(StringArray, CanvasDetailedView, DetailedViewMouseX, DetailedViewMouseY+20);\n" 1736 " }\n" 1737 " ProfileLeave();\n" 1738 "}\n" 1739 "\n" 1740 "function FormatMeta(Value, Dec)\n" 1741 "{\n" 1742 " if(!Value)\n" 1743 " {\n" 1744 " Value = \"0\";\n" 1745 " }\n" 1746 " else\n" 1747 " {\n" 1748 " Value = \'\' + Value.toFixed(Dec);\n" 1749 " }\n" 1750 " return Value;\n" 1751 "}\n" 1752 "\n" 1753 "function DrawBarView()\n" 1754 "{\n" 1755 " ProfileEnter(\"DrawBarView\");\n" 1756 " Invalidate++;\n" 1757 " nHoverToken = -1;\n" 1758 " nHoverFrame = -1;\n" 1759 " var context = CanvasDetailedView.getContext(\'2d\');\n" 1760 " context.clearRect(0, 0, nWidth, nHeight);\n" 1761 "\n" 1762 " var Height = BoxHeight;\n" 1763 " var Width = nWidth;\n" 1764 "\n" 1765 " //clamp offset to prevent scrolling into the void\n" 1766 " var nTotalRows = 0;\n" 1767 " for(var groupid in GroupInfo)\n" 1768 " {\n" 1769 " if(GroupsAllActive || GroupsActive[GroupInfo[groupid].name])\n" 1770 " {\n" 1771 " nTotalRows += GroupInfo[groupid].TimerArray.length + 1;\n" 1772 " }\n" 1773 " }\n" 1774 " var nTotalRowPixels = nTotalRows * Height;\n" 1775 " var nFrameRows = nHeight - BoxHeight;\n" 1776 " if(nOffsetBarsY + nFrameRows > nTotalRowPixels && nTotalRowPixels > nFrameRows)\n" 1777 " {\n" 1778 " nOffsetBarsY = nTotalRowPixels - nFrameRows;\n" 1779 " }\n" 1780 "\n" 1781 "\n" 1782 " var Y = -nOffsetBarsY + BoxHeight;\n" 1783 " if(TimersGroups)\n" 1784 " {\n" 1785 " nOffsetBarsX = 0;\n" 1786 " }\n" 1787 " var XBase = -nOffsetBarsX;\n" 1788 " var nColorIndex = 0;\n" 1789 "\n" 1790 " context.fillStyle = \'white\';\n" 1791 " context.font = Font;\n" 1792 " var bMouseIn = 0;\n" 1793 " var RcpReferenceTime = 1.0 / ReferenceTime;\n" 1794 " var CountWidth = 8 * FontWidth;\n" 1795 " var nMetaLen = TimerInfo[0].meta.length;\n" 1796 " var nMetaCharacters = 10;\n" 1797 " for(var i = 0; i < nMetaLen; ++i)\n" 1798 " {\n" 1799 " if(nMetaCharacters < MetaNames[i].length)\n" 1800 " nMetaCharacters = MetaNames[i].length;\n" 1801 " }\n" 1802 " var nWidthMeta = nMetaCharacters * FontWidth + 6;\n" 1803 " function DrawHeaderSplit(Header)\n" 1804 " {\n" 1805 " context.fillStyle = \'white\';\n" 1806 " context.fillText(Header, X, Height-FontAscent);\n" 1807 " X += nWidthBars;\n" 1808 " context.fillStyle = nBackColorOffset;\n" 1809 " X += nWidthMs;\n" 1810 " if(X >= NameWidth)\n" 1811 " {\n" 1812 " context.fillRect(X-3, 0, 1, nHeight);\n" 1813 " }\n" 1814 " }\n" 1815 " function DrawHeaderSplitSingle(Header, Width)\n" 1816 " {\n" 1817 " context.fillStyle = \'white\';\n" 1818 " context.fillText(Header, X, Height-FontAscent);\n" 1819 " X += Width;\n" 1820 " context.fillStyle = nBackColorOffset;\n" 1821 " if(X >= NameWidth)\n" 1822 " {\n" 1823 " context.fillRect(X-3, 0, 1, nHeight);\n" 1824 " }\n" 1825 " }\n" 1826 " function DrawHeaderSplitLeftRight(HeaderLeft, HeaderRight, Width)\n" 1827 " {\n" 1828 " context.textAlign = \'left\';\n" 1829 " context.fillStyle = \'white\';\n" 1830 " context.fillText(HeaderLeft, X, Height-FontAscent);\n" 1831 " X += Width;\n" 1832 " context.textAlign = \'right\';\n" 1833 " context.fillText(HeaderRight, X-5, Height-FontAscent);\n" 1834 " context.textAlign = \'left\';\n" 1835 " context.fillStyle = nBackColorOffset;\n" 1836 " if(X >= NameWidth)\n" 1837 " {\n" 1838 " context.fillRect(X-3, 0, 1, nHeight);\n" 1839 " }\n" 1840 " }\n" 1841 " function DrawTimer(Value, Color)\n" 1842 " {\n" 1843 " var Prc = Value * RcpReferenceTime;\n" 1844 " var YText = Y+Height-FontAscent;\n" 1845 " if(Prc > 1)\n" 1846 " {\n" 1847 " Prc = 1;\n" 1848 " }\n" 1849 " context.fillStyle = Color;\n" 1850 " context.fillRect(X+1, Y+1, Prc * nBarsWidth, InnerBoxHeight);\n" 1851 " X += nWidthBars;\n" 1852 " context.fillStyle = \'white\';\n" 1853 " context.fillText((\" \" + Value.toFixed(2)).slice(-TimerLen), X, YText);\n" 1854 " X += nWidthMs;\n" 1855 " }\n" 1856 " function DrawMeta(Value, Width, Dec)\n" 1857 " {\n" 1858 " Value = FormatMeta(Value, Dec);\n" 1859 " X += (FontWidth*Width);\n" 1860 " context.textAlign = \'right\';\n" 1861 " context.fillText(Value, X-FontWidth, YText);\n" 1862 " context.textAlign = \'left\';\n" 1863 " }\n" 1864 " var InnerBoxHeight = BoxHeight-2;\n" 1865 " var TimerLen = 6;\n" 1866 " var TimerWidth = TimerLen * FontWidth;\n" 1867 " var nWidthBars = nBarsWidth+2;\n" 1868 " var nWidthMs = TimerWidth+2+10;\n" 1869 "\n" 1870 "\n" 1871 " if(2 == TimersGroups)\n" 1872 " {\n" 1873 " for(var i = 0; i < ThreadNames.length; ++i)\n" 1874 " {\n" 1875 " if(ThreadsActive[ThreadNames[i]] || ThreadsAllActive)\n" 1876 " {\n" 1877 " var X = 0;\n" 1878 " var YText = Y+Height-FontAscent;\n" 1879 " bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n" 1880 " nColorIndex = 1-nColorIndex;\n" 1881 " context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n" 1882 " context.fillRect(0, Y, Width, Height);\n" 1883 " var ThreadColor = CSwitchColors[i % CSwitchColors.length];\n" 1884 " context.fillStyle = ThreadColor;\n" 1885 " context.fillText(ThreadNames[i], 1, YText);\n" 1886 " context.textAlign = \'left\';\n" 1887 " Y += Height;\n" 1888 " for(var idx in GroupOrder)\n" 1889 " {\n" 1890 " var groupid = GroupOrder[idx];\n" 1891 " var Group = GroupInfo[groupid];\n" 1892 " var PerThreadTimer = ThreadGroupTimeArray[i][groupid];\n" 1893 " var PerThreadTimerTotal = ThreadGroupTimeTotalArray[i][groupid];\n" 1894 " if((PerThreadTimer > 0.0001|| PerThreadTimerTotal>0.1) && (GroupsAllActive || GroupsActive[Group.name]))\n" 1895 " {\n" 1896 " var GColor = GroupColors ? GroupInfo[groupid].color : \'white\';\n" 1897 " var X = 0;\n" 1898 " nColorIndex = 1-nColorIndex;\n" 1899 " bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n" 1900 " context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n" 1901 " context.fillRect(0, Y, Width, nHeight);\n" 1902 " context.fillStyle = GColor;\n" 1903 " context.textAlign = \'right\';\n" 1904 " context.fillText(Group.name, NameWidth - 5, Y+Height-FontAscent);\n" 1905 " context.textAlign = \'left\';\n" 1906 " X += NameWidth;\n" 1907 " DrawTimer(PerThreadTimer, GColor);\n" 1908 " X += nWidthBars + nWidthMs; \n" 1909 " DrawTimer(PerThreadTimerTotal, GColor);\n" 1910 "\n" 1911 " Y += Height;\n" 1912 " }\n" 1913 " }\n" 1914 " }\n" 1915 " }\n" 1916 " }\n" 1917 " else\n" 1918 " {\n" 1919 " for(var idx in GroupOrder)\n" 1920 " {\n" 1921 " var groupid = GroupOrder[idx];\n" 1922 " var Group = GroupInfo[groupid];\n" 1923 " var GColor = GroupColors ? GroupInfo[groupid].color : \'white\';\n" 1924 " if(GroupsAllActive || GroupsActive[Group.name])\n" 1925 " {\n" 1926 " var TimerArray = Group.TimerArray;\n" 1927 " var X = XBase;\n" 1928 " nColorIndex = 1-nColorIndex;\n" 1929 " bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n" 1930 " context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n" 1931 " context.fillRect(0, Y, Width, nHeight);\n" 1932 " context.fillStyle = GColor;\n" 1933 " context.fillText(Group.name, 1, Y+Height-FontAscent);\n" 1934 " X += NameWidth;\n" 1935 " DrawTimer(Group.average, GColor);\n" 1936 " DrawTimer(Group.max, GColor);\n" 1937 " DrawTimer(Group.total, GColor);\n" 1938 "\n" 1939 " context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n" 1940 " context.fillRect(0, Y, NameWidth, nHeight);\n" 1941 " context.fillStyle = GColor;\n" 1942 " context.fillText(Group.name, 1, Y+Height-FontAscent);\n" 1943 "\n" 1944 "\n" 1945 "\n" 1946 " Y += Height;\n" 1947 " if(TimersGroups)\n" 1948 " {\n" 1949 " for(var i = 0; i < ThreadNames.length; ++i)\n" 1950 " {\n" 1951 " var PerThreadTimer = ThreadGroupTimeArray[i][groupid];\n" 1952 " var PerThreadTimerTotal = ThreadGroupTimeTotalArray[i][groupid];\n" 1953 " if((PerThreadTimer > 0.0001|| PerThreadTimerTotal>0.1) && (ThreadsActive[ThreadNames[i]] || ThreadsAllActive))\n" 1954 " {\n" 1955 " var YText = Y+Height-FontAscent;\n" 1956 " bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n" 1957 " nColorIndex = 1-nColorIndex;\n" 1958 " context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n" 1959 " context.fillRect(0, Y, Width, Height);\n" 1960 " var ThreadColor = CSwitchColors[i % CSwitchColors.length];\n" 1961 " context.fillStyle = ThreadColor;\n" 1962 " context.textAlign = \'right\';\n" 1963 " context.fillText(ThreadNames[i], NameWidth - 5, YText);\n" 1964 " context.textAlign = \'left\';\n" 1965 " X = NameWidth;\n" 1966 " DrawTimer(PerThreadTimer, ThreadColor);\n" 1967 " X += nWidthBars + nWidthMs; \n" 1968 " DrawTimer(PerThreadTimerTotal, ThreadColor);\n" 1969 " Y += Height;\n" 1970 " }\n" 1971 " }\n" 1972 " }\n" 1973 " else\n" 1974 " {\n" 1975 " for(var timerindex in TimerArray)\n" 1976 " {\n" 1977 " var timerid = TimerArray[timerindex];\n" 1978 " var Timer = TimerInfo[timerid];\n" 1979 " var Average = Timer.average;\n" 1980 " var Max = Timer.max;\n" 1981 " var ExclusiveMax = Timer.exclmax;\n" 1982 " var ExclusiveAverage = Timer.exclaverage;\n" 1983 " var CallAverage = Timer.callaverage;\n" 1984 " var CallCount = Timer.callcount;\n" 1985 " var YText = Y+Height-FontAscent;\n" 1986 " X = NameWidth + XBase;\n" 1987 "\n" 1988 " nColorIndex = 1-nColorIndex;\n" 1989 " bMouseIn = DetailedViewMouseY >= Y && DetailedViewMouseY < Y + BoxHeight;\n" 1990 " if(bMouseIn)\n" 1991 " {\n" 1992 " nHoverToken = timerid;\n" 1993 " }\n" 1994 " context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n" 1995 " context.fillRect(0, Y, Width, Height);\n" 1996 "\n" 1997 " DrawTimer(Average, Timer.color);\n" 1998 " DrawTimer(Max,Timer.color);\n" 1999 " DrawTimer(Timer.total,Timer.color);\n" 2000 " DrawTimer(CallAverage,Timer.color);\n" 2001 " context.fillStyle = \'white\';\n" 2002 " context.fillText(CallCount, X, YText);\n" 2003 " X += CountWidth;\n" 2004 " DrawTimer(ExclusiveAverage,Timer.color);\n" 2005 " DrawTimer(ExclusiveMax,Timer.color);\n" 2006 "\n" 2007 " if(TimersMeta)\n" 2008 " {\n" 2009 " context.fillStyle = \'white\';\n" 2010 " for(var j = 0; j < nMetaLen; ++j)\n" 2011 " {\n" 2012 " // var Len = MetaNames[j].length + 1;\n" 2013 " DrawMeta(Timer.meta[j], MetaLengths[j], 0);\n" 2014 " DrawMeta(Timer.metaavg[j], MetaLengthsAvg[j], 2);\n" 2015 " DrawMeta(Timer.metamax[j], MetaLengthsMax[j], 0);\n" 2016 " }\n" 2017 " }\n" 2018 " context.fillStyle = bMouseIn ? nBackColorOffset : nBackColors[nColorIndex];\n" 2019 " context.fillRect(0, Y, NameWidth, Height);\n" 2020 " context.textAlign = \'right\';\n" 2021 " context.fillStyle = Timer.color;\n" 2022 " context.fillText(Timer.name, NameWidth - 5, YText);\n" 2023 " context.textAlign = \'left\';\n" 2024 "\n" 2025 "\n" 2026 " Y += Height;\n" 2027 " } \n" 2028 " }\n" 2029 " }\n" 2030 " }\n" 2031 " }\n" 2032 " X = 0;\n" 2033 " context.fillStyle = nBackColorOffset;\n" 2034 " context.fillRect(0, 0, Width, Height);\n" 2035 " context.fillStyle = \'white\';\n" 2036 " if(TimersGroups)\n" 2037 " {\n" 2038 " if(2 == TimersGroups)\n" 2039 " {\n" 2040 " DrawHeaderSplitLeftRight(\'Thread\', \'Group\', NameWidth);\n" 2041 " DrawHeaderSplit(\'Average\');\n" 2042 " }\n" 2043 " else\n" 2044 " {\n" 2045 " DrawHeaderSplitLeftRight(\'Group\', \'Thread\', NameWidth);\n" 2046 " DrawHeaderSplit(\'Average\');\n" 2047 " DrawHeaderSplit(\'Max\');\n" 2048 " DrawHeaderSplit(\'Total\');\n" 2049 " }\n" 2050 " }\n" 2051 " else\n" 2052 " {\n" 2053 " X = NameWidth + XBase;\n" 2054 " DrawHeaderSplit(\'Average\');\n" 2055 " DrawHeaderSplit(\'Max\');\n" 2056 " DrawHeaderSplit(\'Total\');\n" 2057 " DrawHeaderSplit(\'Call Average\');\n" 2058 " DrawHeaderSplitSingle(\'Count\', CountWidth);\n" 2059 " DrawHeaderSplit(\'Excl Average\');\n" 2060 " DrawHeaderSplit(\'Excl Max\');\n" 2061 " if(TimersMeta)\n" 2062 " {\n" 2063 " for(var i = 0; i < nMetaLen; ++i)\n" 2064 " {\n" 2065 " DrawHeaderSplitSingle(MetaNames[i], MetaLengths[i] * FontWidth);\n" 2066 " DrawHeaderSplitSingle(MetaNames[i] + \" Avg\", MetaLengthsAvg[i] * FontWidth);\n" 2067 " DrawHeaderSplitSingle(MetaNames[i] + \" Max\", MetaLengthsMax[i] * FontWidth);\n" 2068 " }\n" 2069 " }\n" 2070 " X = 0;\n" 2071 " context.fillStyle = nBackColorOffset;\n" 2072 " context.fillRect(0, 0, NameWidth, Height);\n" 2073 " context.fillStyle = \'white\';\n" 2074 " \n" 2075 " DrawHeaderSplitLeftRight(\'Group\', \'Timer\', NameWidth);\n" 2076 " \n" 2077 " }\n" 2078 "\n" 2079 " ProfileLeave();\n" 2080 "}\n" 2081 "\n" 2082 "\n" 2083 "//preprocess context switch data to contain array per thread\n" 2084 "function PreprocessContextSwitchCacheItem(ThreadId)\n" 2085 "{\n" 2086 " console.log(\'context switch preparing \' + ThreadId);\n" 2087 " var CSObject = CSwitchCache[ThreadId];\n" 2088 " if(ThreadId > 0 && !CSObject)\n" 2089 " {\n" 2090 " CSArrayIn = new Array();\n" 2091 " CSArrayOut = new Array();\n" 2092 " CSArrayCpu = new Array();\n" 2093 " var nCount = CSwitchTime.length;\n" 2094 " var j = 0;\n" 2095 " var TimeIn = -1.0;\n" 2096 " for(var i = 0; i < nCount; ++i)\n" 2097 " { \n" 2098 " var ThreadIn = CSwitchThreadInOutCpu[j];\n" 2099 " var ThreadOut = CSwitchThreadInOutCpu[j+1];\n" 2100 " var Cpu = CSwitchThreadInOutCpu[j+2];\n" 2101 " if(TimeIn < 0)\n" 2102 " {\n" 2103 " if(ThreadIn == ThreadId)\n" 2104 " {\n" 2105 " TimeIn = CSwitchTime[i];\n" 2106 " }\n" 2107 " }\n" 2108 " else\n" 2109 " {\n" 2110 " if(ThreadOut == ThreadId)\n" 2111 " {\n" 2112 " var TimeOut = CSwitchTime[i];\n" 2113 " CSArrayIn.push(TimeIn);\n" 2114 " CSArrayOut.push(TimeOut);\n" 2115 " CSArrayCpu.push(Cpu);\n" 2116 " TimeIn = -1;\n" 2117 " }\n" 2118 " }\n" 2119 " j += 3;\n" 2120 " }\n" 2121 " CSObject = new Object();\n" 2122 " CSObject.Size = CSArrayIn.length;\n" 2123 " CSObject.In = CSArrayIn;\n" 2124 " CSObject.Out = CSArrayOut;\n" 2125 " CSObject.Cpu = CSArrayCpu;\n" 2126 " CSwitchCache[ThreadId] = CSObject;\n" 2127 " }\n" 2128 "\n" 2129 "}\n" 2130 "function PreprocessContextSwitchCache()\n" 2131 "{\n" 2132 " ProfileEnter(\"PreprocessContextSwitchCache\");\n" 2133 " var AllThreads = {};\n" 2134 " var nCount = CSwitchTime.length;\n" 2135 " for(var i = 0; i < nCount; ++i)\n" 2136 " { \n" 2137 " var nThreadIn = CSwitchThreadInOutCpu[i];\n" 2138 " if(!AllThreads[nThreadIn])\n" 2139 " {\n" 2140 " AllThreads[nThreadIn] = \'\' + nThreadIn;\n" 2141 " var FoundThread = false;\n" 2142 " for(var i = 0; i < ThreadIds.length; ++i)\n" 2143 " {\n" 2144 " if(ThreadIds[i] == nThreadIn)\n" 2145 " {\n" 2146 " FoundThread = true;\n" 2147 " }\n" 2148 " }\n" 2149 " if(!FoundThread)\n" 2150 " {\n" 2151 " CSwitchOnlyThreads.push(nThreadIn);\n" 2152 " }\n" 2153 " }\n" 2154 " }\n" 2155 " for(var i = 0; i < CSwitchOnlyThreads.length; ++i)\n" 2156 " {\n" 2157 " PreprocessContextSwitchCacheItem(CSwitchOnlyThreads[i]);\n" 2158 " }\n" 2159 " for(var i = 0; i < ThreadIds.length; ++i)\n" 2160 " {\n" 2161 " PreprocessContextSwitchCacheItem(ThreadIds[i]); \n" 2162 " }\n" 2163 " ProfileLeave();\n" 2164 "}\n" 2165 "\n" 2166 "function DrawContextSwitchBars(context, ThreadId, fScaleX, fOffsetY, fDetailedOffset, nHoverColor, MinWidth, bDrawEnabled)\n" 2167 "{\n" 2168 " ProfileEnter(\"DrawContextSwitchBars\");\n" 2169 " var CSObject = CSwitchCache[ThreadId];\n" 2170 " if(CSObject)\n" 2171 " {\n" 2172 " var Size = CSObject.Size; \n" 2173 " var In = CSObject.In;\n" 2174 " var Out = CSObject.Out;\n" 2175 " var Cpu = CSObject.Cpu;\n" 2176 " var nNumColors = CSwitchColors.length;\n" 2177 " for(var i = 0; i < Size; ++i)\n" 2178 " {\n" 2179 " var TimeIn = In[i];\n" 2180 " var TimeOut = Out[i];\n" 2181 " var ActiveCpu = Cpu[i];\n" 2182 "\n" 2183 " var X = (TimeIn - fDetailedOffset) * fScaleX;\n" 2184 " if(X > nWidth)\n" 2185 " {\n" 2186 " break;\n" 2187 " }\n" 2188 " var W = (TimeOut - TimeIn) * fScaleX;\n" 2189 " if(W > MinWidth && X+W > 0)\n" 2190 " {\n" 2191 " if(nHoverCSCpu == ActiveCpu || bDrawEnabled)\n" 2192 " {\n" 2193 " if(nHoverCSCpu == ActiveCpu)\n" 2194 " {\n" 2195 " context.fillStyle = nHoverColor;\n" 2196 " }\n" 2197 " else\n" 2198 " {\n" 2199 " context.fillStyle = CSwitchColors[ActiveCpu % nNumColors];\n" 2200 " }\n" 2201 " context.fillRect(X, fOffsetY, W, CSwitchHeight);\n" 2202 " }\n" 2203 " if(DetailedViewMouseX >= X && DetailedViewMouseX <= X+W && DetailedViewMouseY < fOffsetY+CSwitchHeight && DetailedViewMouseY >= fOffsetY)\n" 2204 " {\n" 2205 " nHoverCSCpuNext = ActiveCpu;\n" 2206 " fRangeBeginNext = TimeIn;\n" 2207 " fRangeEndNext = TimeOut;\n" 2208 " fRangeBeginGpuNext = fRangeEndGpuNext = -1;\n" 2209 " }\n" 2210 " }\n" 2211 " }\n" 2212 " }\n" 2213 " ProfileLeave();\n" 2214 "}\n" 2215 "\n" 2216 "function DrawDetailedView(context, MinWidth, bDrawEnabled)\n" 2217 "{\n" 2218 " if(bDrawEnabled)\n" 2219 " {\n" 2220 " DrawDetailedBackground(context);\n" 2221 " }\n" 2222 "\n" 2223 " var colors = [ \'#ff0000\', \'#ff00ff\', \'#ffff00\'];\n" 2224 "\n" 2225 " var fScaleX = nWidth / fDetailedRange; \n" 2226 " var fOffsetY = -nOffsetY + BoxHeight;\n" 2227 " nHoverTokenNext = -1;\n" 2228 " nHoverTokenLogIndexNext = -1;\n" 2229 " nHoverTokenIndexNext = -1;\n" 2230 " nHoverCounter += nHoverCounterDelta;\n" 2231 " if(nHoverCounter >= 255) \n" 2232 " {\n" 2233 " nHoverCounter = 255;\n" 2234 " nHoverCounterDelta = -nHoverCounterDelta;\n" 2235 " }\n" 2236 " if(nHoverCounter < 128) \n" 2237 " {\n" 2238 " nHoverCounter = 128;\n" 2239 " nHoverCounterDelta = -nHoverCounterDelta;\n" 2240 " }\n" 2241 " var nHoverHigh = nHoverCounter.toString(16);\n" 2242 " var nHoverLow = (127+255-nHoverCounter).toString(16);\n" 2243 " var nHoverColor = \'#\' + nHoverHigh + nHoverHigh + nHoverHigh;\n" 2244 "\n" 2245 " context.fillStyle = \'black\';\n" 2246 " context.font = Font;\n" 2247 " var nNumLogs = Frames[0].ts.length;\n" 2248 " var fTimeEnd = fDetailedOffset + fDetailedRange;\n" 2249 "\n" 2250 " var FirstFrame = 0;\n" 2251 " for(var i = 0; i < Frames.length ; i++)\n" 2252 " {\n" 2253 " if(Frames[i].frameend < fDetailedOffset)\n" 2254 " {\n" 2255 " FirstFrame = i;\n" 2256 " }\n" 2257 " }\n" 2258 " var nMinTimeMs = MinWidth / fScaleX;\n" 2259 " {\n" 2260 "\n" 2261 " var Batches = new Array(TimerInfo.length);\n" 2262 " var BatchesTxt = Array();\n" 2263 " var BatchesTxtPos = Array();\n" 2264 " var BatchesTxtColor = [\'#ffffff\', \'#333333\'];\n" 2265 "\n" 2266 " for(var i = 0; i < 2; ++i)\n" 2267 " {\n" 2268 " BatchesTxt[i] = Array();\n" 2269 " BatchesTxtPos[i] = Array();\n" 2270 " }\n" 2271 " for(var i = 0; i < Batches.length; ++i)\n" 2272 " {\n" 2273 " Batches[i] = Array();\n" 2274 " }\n" 2275 " for(nLog = 0; nLog < nNumLogs; nLog++)\n" 2276 " {\n" 2277 " var ThreadName = ThreadNames[nLog];\n" 2278 " if(ThreadsAllActive || ThreadsActive[ThreadName])\n" 2279 " {\n" 2280 "\n" 2281 " var LodIndex = 0;\n" 2282 " var MinDelta = 0;\n" 2283 " var NextLod = 1;\n" 2284 " while(NextLod < LodData.length && LodData[NextLod].MinDelta[nLog] < nMinTimeMs)\n" 2285 " {\n" 2286 " LodIndex = NextLod;\n" 2287 " NextLod = NextLod + 1;\n" 2288 " MinDelta = LodData[LodIndex].MinDelta[nLog];\n" 2289 " }\n" 2290 " if(LodIndex == LodData.length)\n" 2291 " {\n" 2292 " LodIndex = LodData.length-1;\n" 2293 " }\n" 2294 " if(DisableLod)\n" 2295 " {\n" 2296 " LodIndex = 0;\n" 2297 " }\n" 2298 "\n" 2299 " context.fillStyle = \'white\';\n" 2300 " fOffsetY += BoxHeight;\n" 2301 " context.fillText(ThreadName, 0, fOffsetY);\n" 2302 " if(nContextSwitchEnabled)\n" 2303 " {\n" 2304 " DrawContextSwitchBars(context, ThreadIds[nLog], fScaleX, fOffsetY, fDetailedOffset, nHoverColor, MinWidth, bDrawEnabled);\n" 2305 " fOffsetY += CSwitchHeight+1;\n" 2306 " }\n" 2307 " var MaxDepth = 1;\n" 2308 " var StackPos = 0;\n" 2309 " var Stack = Array(20);\n" 2310 " var Lod = LodData[LodIndex];\n" 2311 "\n" 2312 " var TypeArray = Lod.TypeArray[nLog];\n" 2313 " var IndexArray = Lod.IndexArray[nLog];\n" 2314 " var TimeArray = Lod.TimeArray[nLog];\n" 2315 "\n" 2316 " var LocalFirstFrame = Frames[FirstFrame].FirstFrameIndex[nLog];\n" 2317 " var IndexStart = Lod.LogStart[LocalFirstFrame][nLog];\n" 2318 " var IndexEnd = TimeArray.length;\n" 2319 " IndexEnd = TimeArray.length;\n" 2320 " var HasSetHover = 0;\n" 2321 "\n" 2322 "\n" 2323 " for(var j = IndexStart; j < IndexEnd; ++j)\n" 2324 " {\n" 2325 " var type = TypeArray[j];\n" 2326 " var index = IndexArray[j];\n" 2327 " var time = TimeArray[j];\n" 2328 " if(type == 1)\n" 2329 " {\n" 2330 " //push\n" 2331 " Stack[StackPos] = j;\n" 2332 " StackPos++;\n" 2333 " if(StackPos > MaxDepth)\n" 2334 " {\n" 2335 " MaxDepth = StackPos;\n" 2336 " }\n" 2337 " }\n" 2338 " else if(type == 0)\n" 2339 " {\n" 2340 " if(StackPos>0)\n" 2341 " {\n" 2342 " StackPos--;\n" 2343 "\n" 2344 " var StartIndex = Stack[StackPos];\n" 2345 " var timestart = TimeArray[StartIndex];\n" 2346 " var timeend = time;\n" 2347 " var X = (timestart - fDetailedOffset) * fScaleX;\n" 2348 " var Y = fOffsetY + StackPos * BoxHeight;\n" 2349 " var W = (timeend-timestart)*fScaleX;\n" 2350 "\n" 2351 " if(W > MinWidth && X < nWidth && X+W > 0)\n" 2352 " {\n" 2353 " if(bDrawEnabled || index == nHoverToken)\n" 2354 " {\n" 2355 " Batches[index].push(X);\n" 2356 " Batches[index].push(Y);\n" 2357 " Batches[index].push(W);\n" 2358 " DebugDrawQuadCount++;\n" 2359 "\n" 2360 " var XText = X < 0 ? 0 : X;\n" 2361 " var WText = W - (XText-X);\n" 2362 " if(XText + WText > nWidth)\n" 2363 " {\n" 2364 " WText = nWidth - XText;\n" 2365 " }\n" 2366 " var Name = TimerInfo[index].name;\n" 2367 " var NameLen = TimerInfo[index].len;\n" 2368 " var BarTextLen = Math.floor((WText-2)/FontWidth);\n" 2369 " var TimeText = TimeToMsString(timeend-timestart);\n" 2370 " var TimeTextLen = TimeText.length;\n" 2371 "\n" 2372 " if(BarTextLen >= 2)\n" 2373 " {\n" 2374 " if(BarTextLen < NameLen)\n" 2375 " Name = Name.substr(0, BarTextLen);\n" 2376 " var txtidx = TimerInfo[index].textcolorindex;\n" 2377 " var YPos = Y+BoxHeight-FontAscent;\n" 2378 " BatchesTxt[txtidx].push(Name);\n" 2379 " BatchesTxtPos[txtidx].push(XText+2);\n" 2380 "\n" 2381 " BatchesTxtPos[txtidx].push(YPos);\n" 2382 " DebugDrawTextCount++;\n" 2383 " if(BarTextLen - NameLen > TimeTextLen)\n" 2384 " {\n" 2385 " BatchesTxt[txtidx].push(TimeText);\n" 2386 " BatchesTxtPos[txtidx].push(XText+WText-2 - TimeTextLen * FontWidth);\n" 2387 " BatchesTxtPos[txtidx].push(YPos);\n" 2388 " DebugDrawTextCount++;\n" 2389 " }\n" 2390 "\n" 2391 " }\n" 2392 " }\n" 2393 "\n" 2394 " if(DetailedViewMouseX >= X && DetailedViewMouseX <= X+W && DetailedViewMouseY < Y+BoxHeight && DetailedViewMouseY >= Y)\n" 2395 " {\n" 2396 " fRangeBeginNext = timestart;\n" 2397 " fRangeEndNext = timeend;\n" 2398 " if(TypeArray[StartIndex+1] == 3 && TypeArray[j+1] == 3)\n" 2399 " {\n" 2400 " fRangeBeginGpuNext = fRangeBeginNext;\n" 2401 " fRangeEndGpuNext = fRangeEndNext;\n" 2402 " //cpu tick is stored following\n" 2403 " fRangeBeginNext = TimeArray[StartIndex+1];\n" 2404 " fRangeEndNext = TimeArray[j+1];\n" 2405 " }\n" 2406 " else\n" 2407 " {\n" 2408 " fRangeBeginGpuNext = -1;\n" 2409 " fRangeEndGpuNext = -1;\n" 2410 " }\n" 2411 "\n" 2412 " nHoverTokenNext = index;\n" 2413 " nHoverTokenIndexNext = j;\n" 2414 " nHoverTokenLogIndexNext = nLog;\n" 2415 " bHasSetHover = 1;\n" 2416 " }\n" 2417 " }\n" 2418 " if(StackPos == 0 && time > fTimeEnd)\n" 2419 " break; \n" 2420 " }\n" 2421 " }\n" 2422 " }\n" 2423 " fOffsetY += (1+g_MaxStack[nLog]) * BoxHeight;\n" 2424 "\n" 2425 " if(HasSetHover)\n" 2426 " {\n" 2427 " for(var i = 0; i < Frames.length-1; ++i)\n" 2428 " {\n" 2429 " var IndexStart = Lod.LogStart[i][nLog];\n" 2430 " if(nHoverTokenNext >= IndexStart)\n" 2431 " {\n" 2432 " nHoverFrame = i;\n" 2433 " }\n" 2434 " }\n" 2435 " }\n" 2436 " }\n" 2437 " }\n" 2438 "\n" 2439 " if(nContextSwitchEnabled) //non instrumented threads.\n" 2440 " {\n" 2441 " var ContextSwitchThreads = CSwitchOnlyThreads;\n" 2442 " for(var i = 0; i < ContextSwitchThreads.length; ++i)\n" 2443 " {\n" 2444 " var ThreadId = ContextSwitchThreads[i];\n" 2445 " var ThreadName = \'\' + ThreadId;\n" 2446 " DrawContextSwitchBars(context, ThreadId, fScaleX, fOffsetY, fDetailedOffset, nHoverColor, MinWidth, bDrawEnabled);\n" 2447 " context.fillStyle = \'white\';\n" 2448 " context.fillText(ThreadName, 0, fOffsetY+5);\n" 2449 " fOffsetY += BoxHeight + 1;\n" 2450 " }\n" 2451 " }\n" 2452 "\n" 2453 "\n" 2454 " {\n" 2455 " for(var i = 0; i < Batches.length; ++i)\n" 2456 " {\n" 2457 " var a = Batches[i];\n" 2458 " if(a.length)\n" 2459 " {\n" 2460 " context.fillStyle = TimerInfo[i].colordark;\n" 2461 " if(!DisableMerge)\n" 2462 " {\n" 2463 " for(var j = 0; j < a.length; j += 3)\n" 2464 " { \n" 2465 " var X = a[j];\n" 2466 " var Y = a[j+1];\n" 2467 " var BaseWidth = j + 2;\n" 2468 " var W = a[BaseWidth];\n" 2469 " while(j+1 < a.length && W < 1)\n" 2470 " {\n" 2471 " var jnext = j+3;\n" 2472 " var XNext = a[jnext];\n" 2473 " var YNext = a[jnext+1];\n" 2474 " var WNext = a[jnext+2];\n" 2475 " var Delta = XNext - (X+W);\n" 2476 " var YDelta = Math.abs(Y - YNext); \n" 2477 " if(Delta < 0.3 && YDelta < 0.5 && WNext < 1)\n" 2478 " {\n" 2479 " W = (XNext+WNext) - X;\n" 2480 " a[BaseWidth] = W;\n" 2481 " a[jnext+2] = 0;\n" 2482 " j += 3;\n" 2483 " }\n" 2484 " else\n" 2485 " {\n" 2486 " break;\n" 2487 " }\n" 2488 "\n" 2489 " }\n" 2490 " }\n" 2491 " }\n" 2492 " var off = 0.7;\n" 2493 " var off2 = 2*off;\n" 2494 " context.fillStyle = TimerInfo[i].colordark;\n" 2495 " for(var j = 0; j < a.length; j += 3)\n" 2496 " { \n" 2497 " var X = a[j];\n" 2498 " var Y = a[j+1];\n" 2499 " var W = a[j+2];\n" 2500 " if(W >= 1)\n" 2501 " {\n" 2502 " context.fillRect(X, Y, W, BoxHeight-1);\n" 2503 " }\n" 2504 " }\n" 2505 " \n" 2506 "\n" 2507 " if(i == nHoverToken)\n" 2508 " {\n" 2509 " context.fillStyle = nHoverColor;\n" 2510 " }\n" 2511 " else\n" 2512 " {\n" 2513 " context.fillStyle = TimerInfo[i].color;\n" 2514 " }\n" 2515 " for(var j = 0; j < a.length; j += 3)\n" 2516 " { \n" 2517 " var X = a[j];\n" 2518 " var Y = a[j+1];\n" 2519 " var W = a[j+2];\n" 2520 " if(W > 0)\n" 2521 " {\n" 2522 " context.fillRect(X+off, Y+off, W-off2, BoxHeight-1-off2);\n" 2523 " }\n" 2524 " }\n" 2525 " }\n" 2526 " } \n" 2527 " }\n" 2528 " for(var i = 0; i < BatchesTxt.length; ++i)\n" 2529 " {\n" 2530 " context.fillStyle = BatchesTxtColor[i];\n" 2531 " var TxtArray = BatchesTxt[i];\n" 2532 " var PosArray = BatchesTxtPos[i];\n" 2533 " for(var j = 0; j < TxtArray.length; ++j)\n" 2534 " {\n" 2535 " var k = j * 2;\n" 2536 " context.fillText(TxtArray[j], PosArray[k],PosArray[k+1]);\n" 2537 " }\n" 2538 " }\n" 2539 "\n" 2540 " }\n" 2541 "}\n" 2542 "function DrawTextBox(context, text, x, y, align)\n" 2543 "{\n" 2544 " var textsize = context.measureText(text).width;\n" 2545 " var offsetx = 0;\n" 2546 " var offsety = -FontHeight;\n" 2547 " if(align == \'center\')\n" 2548 " {\n" 2549 " offsetx = -textsize / 2.0;\n" 2550 " }\n" 2551 " else if(align == \'right\')\n" 2552 " {\n" 2553 " offsetx = -textsize;\n" 2554 " }\n" 2555 " context.fillStyle = nBackColors[0];\n" 2556 " context.fillRect(x + offsetx, y + offsety, textsize+2, FontHeight + 2);\n" 2557 " context.fillStyle = \'white\';\n" 2558 " context.fillText(text, x, y);\n" 2559 "\n" 2560 "}\n" 2561 "function DrawRange(context, fBegin, fEnd, ColorBack, ColorFront, Offset, Name)\n" 2562 "{\n" 2563 " if(fBegin < fEnd)\n" 2564 " {\n" 2565 " var fScaleX = nWidth / fDetailedRange; \n" 2566 " var X = (fBegin - fDetailedOffset) * fScaleX;\n" 2567 " var YSpace = (FontHeight+2);\n" 2568 " var Y = YSpace * (Offset);\n" 2569 " var W = (fEnd - fBegin) * fScaleX;\n" 2570 " context.globalAlpha = 0.1;\n" 2571 " context.fillStyle = ColorBack;\n" 2572 " context.fillRect(X, 0, W, nHeight);\n" 2573 " context.globalAlpha = 1;\n" 2574 " context.strokeStyle = ColorFront;\n" 2575 " context.beginPath();\n" 2576 " context.moveTo(X, 0);\n" 2577 " context.lineTo(X, nHeight);\n" 2578 " context.moveTo(X+W, 0);\n" 2579 " context.lineTo(X+W, nHeight);\n" 2580 " context.stroke();\n" 2581 " var Duration = (fEnd - fBegin).toFixed(2) + \"ms\";\n" 2582 " var Center = ((fBegin + fEnd) / 2.0) - fDetailedOffset;\n" 2583 " var DurationWidth = context.measureText(Duration+ \" \").width;\n" 2584 "\n" 2585 " context.fillStyle = \'white\';\n" 2586 " context.textAlign = \'right\';\n" 2587 " var TextPosY = Y + YSpace;\n" 2588 " DrawTextBox(context, \'\' + fBegin.toFixed(2), X-3, TextPosY, \'right\');\n" 2589 " if(DurationWidth < W + 10)\n" 2590 " {\n" 2591 " context.textAlign = \'center\';\n" 2592 " DrawTextBox(context,\'\' + Duration,Center * fScaleX, TextPosY, \'center\');\n" 2593 "\n" 2594 " var W0 = W - DurationWidth + FontWidth*1.5;\n" 2595 " if(W0 > 6)\n" 2596 " {\n" 2597 " var Y0 = Y + FontHeight * 0.5;\n" 2598 " W0 = W0 / 2.0;\n" 2599 " var X0 = X + W0;\n" 2600 " var X1 = X + W - W0;\n" 2601 " context.strokeStyle = ColorFront;\n" 2602 " context.beginPath();\n" 2603 " context.moveTo(X, Y0);\n" 2604 " context.lineTo(X0, Y0);\n" 2605 " context.moveTo(X0, Y0-2);\n" 2606 " context.lineTo(X0, Y0+2);\n" 2607 " context.moveTo(X1, Y0-2);\n" 2608 " context.lineTo(X1, Y0+2);\n" 2609 " context.moveTo(X1, Y0);\n" 2610 " context.lineTo(X + W, Y0);\n" 2611 " context.stroke();\n" 2612 " }\n" 2613 " }\n" 2614 " context.textAlign = \'left\';\n" 2615 " DrawTextBox(context, \'\' + fEnd.toFixed(2), X + W + 2, TextPosY, \'left\');\n" 2616 " DrawTextBox(context, Name, X + W + 2, nHeight - FontHeight - YSpace*Offset, \'left\');\n" 2617 " Offset += 1;\n" 2618 " }\n" 2619 " return Offset;\n" 2620 "}\n" 2621 "\n" 2622 "function DrawDetailed(Animation)\n" 2623 "{\n" 2624 " if(AnimationActive != Animation || !Initialized)\n" 2625 " {\n" 2626 " return;\n" 2627 " }\n" 2628 " ProfileEnter(\"DrawDetailed\");\n" 2629 " DebugDrawQuadCount = 0;\n" 2630 " DebugDrawTextCount = 0;\n" 2631 " nHoverCSCpuNext = -1;\n" 2632 "\n" 2633 " fRangeBeginNext = fRangeEndNext = -1;\n" 2634 " fRangeBeginGpuNext = fRangeEndGpuNext = -1;\n" 2635 " var fRangeBeginGpu = -1;\n" 2636 " var fRangeEndGpu = -1;\n" 2637 "\n" 2638 " var start = new Date();\n" 2639 " nDrawCount++;\n" 2640 "\n" 2641 " var context = CanvasDetailedView.getContext(\'2d\');\n" 2642 " var offscreen = CanvasDetailedOffscreen.getContext(\'2d\');\n" 2643 " var fScaleX = nWidth / fDetailedRange; \n" 2644 " var fOffsetY = -nOffsetY + BoxHeight;\n" 2645 "\n" 2646 " if(DetailedRedrawState.fOffsetY == fOffsetY && DetailedRedrawState.fDetailedOffset == fDetailedOffset && DetailedRedrawState.fDetailedRange == fDetailedRange && !KeyCtrlDown && !KeyShiftDown && !MouseDragButton)\n" 2647 " {\n" 2648 " Invalidate++;\n" 2649 " }\n" 2650 " else\n" 2651 " {\n" 2652 " Invalidate = 0;\n" 2653 " DetailedRedrawState.fOffsetY = fOffsetY;\n" 2654 " DetailedRedrawState.fDetailedOffset = fDetailedOffset;\n" 2655 " DetailedRedrawState.fDetailedRange = fDetailedRange;\n" 2656 " }\n" 2657 " if(Invalidate == 0) //when panning, only draw bars that are a certain width to keep decent framerate\n" 2658 " {\n" 2659 " context.clearRect(0, 0, CanvasDetailedView.width, CanvasDetailedView.height);\n" 2660 " DrawDetailedView(context, nMinWidthPan, true);\n" 2661 " }\n" 2662 " else if(Invalidate == 1) //draw full and store\n" 2663 " {\n" 2664 " offscreen.clearRect(0, 0, CanvasDetailedView.width, CanvasDetailedView.height);\n" 2665 " DrawDetailedView(offscreen, nMinWidth, true);\n" 2666 " OffscreenData = offscreen.getImageData(0, 0, CanvasDetailedOffscreen.width, CanvasDetailedOffscreen.height);\n" 2667 " }\n" 2668 " else//reuse stored result untill next time viewport is changed.\n" 2669 " {\n" 2670 " context.clearRect(0, 0, CanvasDetailedView.width, CanvasDetailedView.height);\n" 2671 " context.putImageData(OffscreenData, 0, 0);\n" 2672 " DrawDetailedView(context, nMinWidth, false);\n" 2673 " }\n" 2674 "\n" 2675 " if(KeyShiftDown || KeyCtrlDown || MouseDragButton || MouseDragSelectRange())\n" 2676 " {\n" 2677 " nHoverToken = -1;\n" 2678 " nHoverTokenIndex = -1;\n" 2679 " nHoverTokenLogIndex = -1;\n" 2680 " fRangeBegin = fRangeEnd = -1;\n" 2681 " }\n" 2682 " else\n" 2683 " {\n" 2684 " nHoverToken = nHoverTokenNext;\n" 2685 " nHoverTokenIndex = nHoverTokenIndexNext;\n" 2686 " nHoverTokenLogIndex = nHoverTokenLogIndexNext;\n" 2687 " if(fRangeBeginHistory < fRangeEndHistory)\n" 2688 " {\n" 2689 " fRangeBegin = fRangeBeginHistory;\n" 2690 " fRangeEnd = fRangeEndHistory;\n" 2691 " fRangeBeginGpu = fRangeBeginHistoryGpu;\n" 2692 " fRangeEndGpu = fRangeEndHistoryGpu;\n" 2693 " }\n" 2694 " else\n" 2695 " {\n" 2696 " fRangeBegin = fRangeBeginNext;\n" 2697 " fRangeEnd = fRangeEndNext;\n" 2698 " fRangeBeginGpu = fRangeBeginGpuNext;\n" 2699 " fRangeEndGpu = fRangeEndGpuNext;\n" 2700 " }\n" 2701 " }\n" 2702 "\n" 2703 " DrawTextBox(context, TimeToMsString(fDetailedOffset), 0, FontHeight, \'left\');\n" 2704 " context.textAlign = \'right\';\n" 2705 " DrawTextBox(context, TimeToMsString(fDetailedOffset + fDetailedRange), nWidth, FontHeight, \'right\');\n" 2706 " context.textAlign = \'left\';\n" 2707 "\n" 2708 " var Offset = 0;\n" 2709 " Offset = DrawRange(context, fRangeBeginSelect, fRangeEndSelect, \'#59d0ff\', \'#00ddff\', Offset, \"Selection\");\n" 2710 " Offset = DrawRange(context, fRangeBegin, fRangeEnd, \'#009900\', \'#00ff00\', Offset, \"Cpu\");\n" 2711 " Offset = DrawRange(context, fRangeBeginGpu, fRangeEndGpu, \'#996600\', \'#775500\', Offset, \"Gpu\");\n" 2712 "\n" 2713 " nHoverCSCpu = nHoverCSCpuNext;\n" 2714 " ProfileLeave();\n" 2715 "}\n" 2716 "\n" 2717 "function ZoomTo(fZoomBegin, fZoomEnd)\n" 2718 "{\n" 2719 " if(fZoomBegin < fZoomEnd)\n" 2720 " {\n" 2721 " AnimationActive = true;\n" 2722 " var fDetailedOffsetOriginal = fDetailedOffset;\n" 2723 " var fDetailedRangeOriginal = fDetailedRange;\n" 2724 " var fDetailedOffsetTarget = fZoomBegin;\n" 2725 " var fDetailedRangeTarget = fZoomEnd - fZoomBegin;\n" 2726 " var TimestampStart = new Date();\n" 2727 " var count = 0;\n" 2728 " function ZoomFunc(Timestamp)\n" 2729 " {\n" 2730 " var fPrc = (new Date() - TimestampStart) / (ZOOM_TIME * 1000.0);\n" 2731 " if(fPrc > 1.0)\n" 2732 " {\n" 2733 " fPrc = 1.0;\n" 2734 " }\n" 2735 " fPrc = Math.pow(fPrc, 0.3);\n" 2736 " fDetailedOffset = fDetailedOffsetOriginal + (fDetailedOffsetTarget - fDetailedOffsetOriginal) * fPrc;\n" 2737 " fDetailedRange = fDetailedRangeOriginal + (fDetailedRangeTarget - fDetailedRangeOriginal) * fPrc;\n" 2738 " DrawDetailed(true);\n" 2739 " if(fPrc >= 1.0)\n" 2740 " {\n" 2741 " AnimationActive = false;\n" 2742 " fDetailedOffset = fDetailedOffsetTarget;\n" 2743 " fDetailedRange = fDetailedRangeTarget;\n" 2744 " }\n" 2745 " else\n" 2746 " {\n" 2747 " requestAnimationFrame(ZoomFunc);\n" 2748 " }\n" 2749 " }\n" 2750 " requestAnimationFrame(ZoomFunc);\n" 2751 " }\n" 2752 "}\n" 2753 "function RequestRedraw()\n" 2754 "{\n" 2755 " Invalidate = 0;\n" 2756 " Draw(1);\n" 2757 "}\n" 2758 "function Draw(RedrawMode)\n" 2759 "{\n" 2760 " if(ProfileMode)\n" 2761 " {\n" 2762 " ProfileModeClear();\n" 2763 " ProfileEnter(\"Total\");\n" 2764 " }\n" 2765 " if(RedrawMode == 1)\n" 2766 " {\n" 2767 " if(Mode == ModeTimers)\n" 2768 " {\n" 2769 " DrawBarView();\n" 2770 " DrawHoverToolTip();\n" 2771 " }\n" 2772 " else if(Mode == ModeDetailed)\n" 2773 " {\n" 2774 " DrawDetailed(false);\n" 2775 " DrawHoverToolTip();\n" 2776 " }\n" 2777 " }\n" 2778 " DrawDetailedFrameHistory();\n" 2779 "\n" 2780 " if(ProfileMode)\n" 2781 " {\n" 2782 " ProfileLeave();\n" 2783 " ProfileModeDraw(CanvasDetailedView);\n" 2784 " }\n" 2785 "}\n" 2786 "\n" 2787 "function AutoRedraw(Timestamp)\n" 2788 "{\n" 2789 " var RedrawMode = 0;\n" 2790 " if(Mode == ModeDetailed)\n" 2791 " {\n" 2792 " if(ProfileMode == 2 || ((nHoverCSCpu >= 0 || nHoverToken != -1) && !KeyCtrlDown && !KeyShiftDown && !MouseDragButton)||(Invalidate<2 && !KeyCtrlDown && !KeyShiftDown && !MouseDragButton))\n" 2793 " {\n" 2794 " RedrawMode = 1;\n" 2795 " }\n" 2796 " }\n" 2797 " else\n" 2798 " {\n" 2799 " if(Invalidate < 1)\n" 2800 " {\n" 2801 " RedrawMode = 1;\n" 2802 " }\n" 2803 " }\n" 2804 " if(RedrawMode)\n" 2805 " {\n" 2806 " Draw(RedrawMode);\n" 2807 " }\n" 2808 " else if(FlashFrameCounter>0)\n" 2809 " {\n" 2810 " Draw(0);\n" 2811 " }\n" 2812 " requestAnimationFrame(AutoRedraw);\n" 2813 "}\n" 2814 "\n" 2815 "\n" 2816 "function ZoomGraph(nZoom)\n" 2817 "{\n" 2818 " var fOldRange = fDetailedRange;\n" 2819 " if(nZoom>0)\n" 2820 " {\n" 2821 " fDetailedRange *= Math.pow(nModDown ? 1.40 : 1.03, nZoom);\n" 2822 " }\n" 2823 " else\n" 2824 " {\n" 2825 " var fNewDetailedRange = fDetailedRange / Math.pow((nModDown ? 1.40 : 1.03), -nZoom);\n" 2826 " if(fNewDetailedRange < 0.0001) //100ns\n" 2827 " fNewDetailedRange = 0.0001;\n" 2828 " fDetailedRange = fNewDetailedRange;\n" 2829 " }\n" 2830 "\n" 2831 " var fDiff = fOldRange - fDetailedRange;\n" 2832 " var fMousePrc = DetailedViewMouseX / nWidth;\n" 2833 " if(fMousePrc < 0)\n" 2834 " {\n" 2835 " fMousePrc = 0;\n" 2836 " }\n" 2837 " fDetailedOffset += fDiff * fMousePrc;\n" 2838 "\n" 2839 "}\n" 2840 "\n" 2841 "function MeasureFont()\n" 2842 "{\n" 2843 " var context = CanvasDetailedView.getContext(\'2d\');\n" 2844 " context.font = Font;\n" 2845 " FontWidth = context.measureText(\'W\').width;\n" 2846 "\n" 2847 "}\n" 2848 "function ResizeCanvas() \n" 2849 "{\n" 2850 " nWidth = window.innerWidth;\n" 2851 " nHeight = window.innerHeight - CanvasHistory.height-2;\n" 2852 " DPR = window.devicePixelRatio;\n" 2853 "\n" 2854 " if(DPR)\n" 2855 " {\n" 2856 " CanvasDetailedView.style.width = nWidth + \'px\'; \n" 2857 " CanvasDetailedView.style.height = nHeight + \'px\';\n" 2858 " CanvasDetailedView.width = nWidth * DPR;\n" 2859 " CanvasDetailedView.height = nHeight * DPR;\n" 2860 " CanvasHistory.style.width = window.innerWidth + \'px\';\n" 2861 " CanvasHistory.style.height = 70 + \'px\';\n" 2862 " CanvasHistory.width = window.innerWidth * DPR;\n" 2863 " CanvasHistory.height = 70 * DPR;\n" 2864 " CanvasHistory.getContext(\'2d\').scale(DPR,DPR);\n" 2865 " CanvasDetailedView.getContext(\'2d\').scale(DPR,DPR);\n" 2866 "\n" 2867 " CanvasDetailedOffscreen.style.width = nWidth + \'px\';\n" 2868 " CanvasDetailedOffscreen.style.height = nHeight + \'px\';\n" 2869 " CanvasDetailedOffscreen.wid"; 2870 2871 const size_t g_MicroProfileHtml_end_1_size = sizeof(g_MicroProfileHtml_end_1); 2872 const char g_MicroProfileHtml_end_2[] = 2873 "th = nWidth * DPR;\n" 2874 " CanvasDetailedOffscreen.height = nHeight * DPR;\n" 2875 " CanvasDetailedOffscreen.getContext(\'2d\').scale(DPR,DPR);\n" 2876 "\n" 2877 " }\n" 2878 " else\n" 2879 " {\n" 2880 " DPR = 1;\n" 2881 " CanvasDetailedView.width = nWidth;\n" 2882 " CanvasDetailedView.height = nHeight;\n" 2883 " CanvasDetailedOffscreen.width = nWidth;\n" 2884 " CanvasDetailedOffscreen.height = nHeight;\n" 2885 " CanvasHistory.width = window.innerWidth;\n" 2886 " }\n" 2887 " RequestRedraw();\n" 2888 "}\n" 2889 "\n" 2890 "var MouseDragOff = 0;\n" 2891 "var MouseDragDown = 1;\n" 2892 "var MouseDragUp = 2;\n" 2893 "var MouseDragMove = 3;\n" 2894 "var MouseDragState = MouseDragOff;\n" 2895 "var MouseDragTarget = 0;\n" 2896 "var MouseDragButton = 0;\n" 2897 "var MouseDragKeyShift = 0;\n" 2898 "var MouseDragKeyCtrl = 0;\n" 2899 "var MouseDragX = 0;\n" 2900 "var MouseDragY = 0;\n" 2901 "var MouseDragXLast = 0;\n" 2902 "var MouseDragYLast = 0;\n" 2903 "var MouseDragXStart = 0;\n" 2904 "var MouseDragYStart = 0;\n" 2905 "\n" 2906 "function clamp(number, min, max)\n" 2907 "{\n" 2908 " return Math.max(min, Math.min(number, max));\n" 2909 "}\n" 2910 "\n" 2911 "function MouseDragPan()\n" 2912 "{\n" 2913 " return MouseDragButton == 1 || MouseDragKeyShift;\n" 2914 "}\n" 2915 "function MouseDragSelectRange()\n" 2916 "{\n" 2917 " return MouseDragState == MouseDragMove && (MouseDragButton == 3 || (MouseDragKeyShift && MouseDragKeyCtrl));\n" 2918 "}\n" 2919 "function MouseHandleDrag()\n" 2920 "{\n" 2921 " if(MouseDragTarget == CanvasDetailedView)\n" 2922 " {\n" 2923 " if(Mode == ModeDetailed)\n" 2924 " {\n" 2925 " if(MouseDragSelectRange())\n" 2926 " {\n" 2927 " var xStart = MouseDragXStart;\n" 2928 " var xEnd = MouseDragX;\n" 2929 " if(xStart > xEnd)\n" 2930 " {\n" 2931 " var Temp = xStart;\n" 2932 " xStart = xEnd;\n" 2933 " xEnd = Temp;\n" 2934 " }\n" 2935 " if(xEnd - xStart > 1)\n" 2936 " {\n" 2937 " fRangeBegin = fDetailedOffset + fDetailedRange * (xStart / nWidth);\n" 2938 " fRangeEnd = fDetailedOffset + fDetailedRange * (xEnd / nWidth);\n" 2939 " fRangeBeginSelect = fDetailedOffset + fDetailedRange * (xStart / nWidth);\n" 2940 " fRangeEndSelect = fDetailedOffset + fDetailedRange * (xEnd / nWidth);\n" 2941 " }\n" 2942 " }\n" 2943 " else if(MouseDragPan())\n" 2944 " {\n" 2945 " var X = MouseDragX - MouseDragXLast;\n" 2946 " var Y = MouseDragY - MouseDragYLast;\n" 2947 " if(X)\n" 2948 " {\n" 2949 " fDetailedOffset += -X * fDetailedRange / nWidth;\n" 2950 " }\n" 2951 " nOffsetY -= Y;\n" 2952 " if(nOffsetY < 0)\n" 2953 " {\n" 2954 " nOffsetY = 0;\n" 2955 " }\n" 2956 " }\n" 2957 " else if(MouseDragKeyCtrl)\n" 2958 " {\n" 2959 " if(MouseDragY != MouseDragYLast)\n" 2960 " {\n" 2961 " ZoomGraph(MouseDragY - MouseDragYLast);\n" 2962 " }\n" 2963 " }\n" 2964 " }\n" 2965 " else if(Mode == ModeTimers)\n" 2966 " {\n" 2967 " if(MouseDragKeyShift || MouseDragButton == 1)\n" 2968 " {\n" 2969 " var X = MouseDragX - MouseDragXLast;\n" 2970 " var Y = MouseDragY - MouseDragYLast;\n" 2971 " nOffsetBarsY -= Y;\n" 2972 " nOffsetBarsX -= X;\n" 2973 " if(nOffsetBarsY < 0)\n" 2974 " {\n" 2975 " nOffsetBarsY = 0;\n" 2976 " }\n" 2977 " if(nOffsetBarsX < 0)\n" 2978 " {\n" 2979 " nOffsetBarsX = 0;\n" 2980 " }\n" 2981 " }\n" 2982 "\n" 2983 " }\n" 2984 "\n" 2985 " }\n" 2986 " else if(MouseDragTarget == CanvasHistory)\n" 2987 " {\n" 2988 " function HistoryFrameTime(x)\n" 2989 " {\n" 2990 " var NumFrames = Frames.length;\n" 2991 " var fBarWidth = nWidth / NumFrames;\n" 2992 " var Index = clamp(Math.floor(NumFrames * x / nWidth), 0, NumFrames-1);\n" 2993 " var Lerp = clamp((x/fBarWidth - Index) , 0, 1);\n" 2994 " var time = Frames[Index].framestart + (Frames[Index].frameend - Frames[Index].framestart) * Lerp;\n" 2995 " return time;\n" 2996 " }\n" 2997 " if(MouseDragSelectRange())\n" 2998 " {\n" 2999 " fRangeBegin = fRangeEnd = -1;\n" 3000 "\n" 3001 " var xStart = MouseDragXStart;\n" 3002 " var xEnd = MouseDragX;\n" 3003 " if(xStart > xEnd)\n" 3004 " {\n" 3005 " var Temp = xStart;\n" 3006 " xStart = xEnd;\n" 3007 " xEnd = Temp;\n" 3008 " }\n" 3009 " if(xEnd - xStart > 2)\n" 3010 " {\n" 3011 " var timestart = HistoryFrameTime(xStart);\n" 3012 " var timeend = HistoryFrameTime(xEnd);\n" 3013 " fDetailedOffset = timestart;\n" 3014 " fDetailedRange = timeend-timestart;\n" 3015 " }\n" 3016 " }\n" 3017 " else if(MouseDragPan())\n" 3018 " {\n" 3019 " var Time = HistoryFrameTime(MouseDragX);\n" 3020 " fDetailedOffset = Time - fDetailedRange / 2.0;\n" 3021 " }\n" 3022 " }\n" 3023 "}\n" 3024 "function MouseHandleDragEnd()\n" 3025 "{\n" 3026 " if(MouseDragTarget == CanvasDetailedView)\n" 3027 " {\n" 3028 "\n" 3029 " }\n" 3030 " else if(MouseDragTarget == CanvasHistory)\n" 3031 " {\n" 3032 " if(!MouseDragSelectRange() && !MouseDragPan())\n" 3033 " {\n" 3034 " ZoomTo(fRangeBegin, fRangeEnd);\n" 3035 " fRangeBegin = fRangeEnd = -1;\n" 3036 " }\n" 3037 "\n" 3038 "\n" 3039 " }\n" 3040 "\n" 3041 "}\n" 3042 "\n" 3043 "function MouseHandleDragClick()\n" 3044 "{\n" 3045 " if(MouseDragTarget == CanvasDetailedView)\n" 3046 " {\n" 3047 " ZoomTo(fRangeBegin, fRangeEnd);\n" 3048 " }\n" 3049 " else if(MouseDragTarget == CanvasHistory)\n" 3050 " {\n" 3051 " if(Mode == ModeDetailed)\n" 3052 " {\n" 3053 " ZoomTo(fRangeBegin, fRangeEnd);\n" 3054 " }\n" 3055 " }\n" 3056 "}\n" 3057 "\n" 3058 "function MapMouseButton(Event)\n" 3059 "{\n" 3060 " if(event.button == 1 || event.which == 1)\n" 3061 " {\n" 3062 " return 1;\n" 3063 " }\n" 3064 " else if(event.button == 3 || event.which == 3)\n" 3065 " {\n" 3066 " return 3;\n" 3067 " }\n" 3068 " else\n" 3069 " {\n" 3070 " return 0;\n" 3071 " }\n" 3072 "}\n" 3073 "\n" 3074 "function MouseDragReset()\n" 3075 "{\n" 3076 " MouseDragState = MouseDragOff;\n" 3077 " MouseDragTarget = 0;\n" 3078 " MouseDragKeyShift = 0;\n" 3079 " MouseDragKeyCtrl = 0;\n" 3080 " MouseDragButton = 0;\n" 3081 "}\n" 3082 "function MouseDragKeyUp()\n" 3083 "{\n" 3084 " if((MouseDragKeyShift && !KeyShiftDown) || (MouseDragKeyCtrl && !KeyCtrlDown))\n" 3085 " {\n" 3086 " MouseHandleDragEnd();\n" 3087 " MouseDragReset();\n" 3088 " }\n" 3089 "}\n" 3090 "function MouseDrag(Source, Event)\n" 3091 "{\n" 3092 " if(Source == MouseDragOff || (MouseDragTarget && MouseDragTarget != Event.target))\n" 3093 " {\n" 3094 " MouseDragReset();\n" 3095 " return;\n" 3096 " }\n" 3097 "\n" 3098 " var LocalRect = Event.target.getBoundingClientRect();\n" 3099 " MouseDragX = Event.clientX - LocalRect.left;\n" 3100 " MouseDragY = Event.clientY - LocalRect.top;\n" 3101 " // console.log(\'cur drag state \' + MouseDragState + \' Source \' + Source);\n" 3102 " if(MouseDragState == MouseDragMove)\n" 3103 " {\n" 3104 " var dx = Math.abs(MouseDragX - MouseDragXStart);\n" 3105 " var dy = Math.abs(MouseDragY - MouseDragYStart);\n" 3106 " if((Source == MouseDragUp && MapMouseButton(Event) == MouseDragButton) ||\n" 3107 " (MouseDragKeyCtrl && !KeyCtrlDown) ||\n" 3108 " (MouseDragKeyShift && !KeyShiftDown))\n" 3109 " {\n" 3110 " MouseHandleDragEnd();\n" 3111 " MouseDragReset();\n" 3112 " return;\n" 3113 " }\n" 3114 " else\n" 3115 " {\n" 3116 " MouseHandleDrag();\n" 3117 " }\n" 3118 " }\n" 3119 " else if(MouseDragState == MouseDragOff)\n" 3120 " {\n" 3121 " if(Source == MouseDragDown || KeyShiftDown || KeyCtrlDown)\n" 3122 " {\n" 3123 " MouseDragTarget = Event.target;\n" 3124 " MouseDragButton = MapMouseButton(Event);\n" 3125 " MouseDragState = MouseDragDown;\n" 3126 " MouseDragXStart = MouseDragX;\n" 3127 " MouseDragYStart = MouseDragY;\n" 3128 " MouseDragKeyCtrl = 0;\n" 3129 " MouseDragKeyShift = 0;\n" 3130 "\n" 3131 " if(KeyShiftDown || KeyCtrlDown)\n" 3132 " {\n" 3133 " MouseDragKeyShift = KeyShiftDown;\n" 3134 " MouseDragKeyCtrl = KeyCtrlDown;\n" 3135 " MouseDragState = MouseDragMove;\n" 3136 " }\n" 3137 " }\n" 3138 " }\n" 3139 " else if(MouseDragState == MouseDragDown)\n" 3140 " {\n" 3141 " if(Source == MouseDragUp)\n" 3142 " {\n" 3143 " MouseHandleDragClick();\n" 3144 " MouseDragReset();\n" 3145 " }\n" 3146 " else if(Source == MouseDragMove)\n" 3147 " {\n" 3148 " var dx = Math.abs(MouseDragX - MouseDragXStart);\n" 3149 " var dy = Math.abs(MouseDragY - MouseDragYStart);\n" 3150 " if(dx+dy>1)\n" 3151 " {\n" 3152 " MouseDragState = MouseDragMove;\n" 3153 " }\n" 3154 " }\n" 3155 " }\n" 3156 " MouseDragXLast = MouseDragX;\n" 3157 " MouseDragYLast = MouseDragY;\n" 3158 "}\n" 3159 "\n" 3160 "function MouseMove(evt)\n" 3161 "{\n" 3162 " evt.preventDefault();\n" 3163 " MouseDrag(MouseDragMove, evt);\n" 3164 " MouseHistory = 0;\n" 3165 " MouseDetailed = 0;\n" 3166 " HistoryViewMouseX = HistoryViewMouseY = -1;\n" 3167 " var rect = evt.target.getBoundingClientRect();\n" 3168 " var x = evt.clientX - rect.left;\n" 3169 " var y = evt.clientY - rect.top;\n" 3170 " if(evt.target == CanvasDetailedView)\n" 3171 " {\n" 3172 " if(!MouseDragSelectRange())\n" 3173 " {\n" 3174 " fRangeBegin = fRangeEnd = -1;\n" 3175 " }\n" 3176 " DetailedViewMouseX = x;\n" 3177 " DetailedViewMouseY = y;\n" 3178 " }\n" 3179 " else if(evt.target = CanvasHistory)\n" 3180 " {\n" 3181 " var Rect = CanvasHistory.getBoundingClientRect();\n" 3182 " HistoryViewMouseX = x;\n" 3183 " HistoryViewMouseY = y;\n" 3184 " }\n" 3185 " Draw(1);\n" 3186 "}\n" 3187 "\n" 3188 "function MouseButton(bPressed, evt)\n" 3189 "{\n" 3190 " evt.preventDefault();\n" 3191 " MouseDrag(bPressed ? MouseDragDown : MouseDragUp, evt);\n" 3192 "}\n" 3193 "\n" 3194 "function MouseOut(evt)\n" 3195 "{\n" 3196 " MouseDrag(MouseDragOff, evt);\n" 3197 " KeyCtrlDown = 0;\n" 3198 " KeyShiftDown = 0;\n" 3199 " MouseDragButton = 0;\n" 3200 " nHoverToken = -1;\n" 3201 " fRangeBegin = fRangeEnd = -1;\n" 3202 "}\n" 3203 "\n" 3204 "function MouseWheel(e)\n" 3205 "{\n" 3206 " var e = window.event || e;\n" 3207 " var delta = (e.wheelDelta || e.detail * (-120));\n" 3208 " ZoomGraph((-4 * delta / 120.0) | 0);\n" 3209 " Draw(1);\n" 3210 "}\n" 3211 "\n" 3212 "\n" 3213 "function KeyUp(evt)\n" 3214 "{\n" 3215 " if(evt.keyCode == 17)\n" 3216 " {\n" 3217 " KeyCtrlDown = 0;\n" 3218 " MouseDragKeyUp();\n" 3219 " }\n" 3220 " else if(evt.keyCode == 16)\n" 3221 " {\n" 3222 " KeyShiftDown = 0;\n" 3223 " MouseDragKeyUp();\n" 3224 " }\n" 3225 " if(evt.keyCode == 18)\n" 3226 " {\n" 3227 " FlipToolTip = 0;\n" 3228 " }\n" 3229 " if(evt.keyCode == 32)\n" 3230 " {\n" 3231 " if(fRangeBeginSelect < fRangeEndSelect)\n" 3232 " {\n" 3233 " ZoomTo(fRangeBeginSelect, fRangeEndSelect);\n" 3234 " fRangeBeginSelect = fRangeEndSelect = -1;\n" 3235 " MouseHandleDragEnd();\n" 3236 " }\n" 3237 " }\n" 3238 " if(evt.keyCode == 27)\n" 3239 " {\n" 3240 " fRangeBeginSelect = fRangeEndSelect = -1; \n" 3241 " }\n" 3242 " Invalidate = 0;\n" 3243 "}\n" 3244 "\n" 3245 "function KeyDown(evt)\n" 3246 "{\n" 3247 " if(evt.keyCode == 18)\n" 3248 " {\n" 3249 " FlipToolTip = 1;\n" 3250 " }\n" 3251 " if(evt.keyCode == 17)\n" 3252 " {\n" 3253 " KeyCtrlDown = 1;\n" 3254 " }\n" 3255 " else if(evt.keyCode == 16)\n" 3256 " {\n" 3257 " KeyShiftDown = 1;\n" 3258 " }\n" 3259 " Invalidate = 0;\n" 3260 "}\n" 3261 "\n" 3262 "function ReadCookie()\n" 3263 "{\n" 3264 " var result = document.cookie.match(/fisk=([^;]+)/);\n" 3265 " var NewMode = ModeDetailed;\n" 3266 " var ReferenceTimeString = \'33ms\';\n" 3267 " if(result && result.length > 0)\n" 3268 " {\n" 3269 " var Obj = JSON.parse(result[1]);\n" 3270 " if(Obj.Mode)\n" 3271 " {\n" 3272 " NewMode = Obj.Mode;\n" 3273 " }\n" 3274 " if(Obj.ReferenceTime)\n" 3275 " {\n" 3276 " ReferenceTimeString = Obj.ReferenceTime;\n" 3277 " }\n" 3278 " if(Obj.ThreadsAllActive || Obj.ThreadsAllActive == 0 || Obj.ThreadsAllActive == false)\n" 3279 " {\n" 3280 " ThreadsAllActive = Obj.ThreadsAllActive;\n" 3281 " }\n" 3282 " else\n" 3283 " {\n" 3284 " ThreadsAllActive = 1;\n" 3285 " }\n" 3286 " if(Obj.ThreadsActive)\n" 3287 " {\n" 3288 " ThreadsActive = Obj.ThreadsActive;\n" 3289 " }\n" 3290 " if(Obj.GroupsAllActive || Obj.GroupsAllActive == 0 || Obj.GroupsAllActive)\n" 3291 " {\n" 3292 " GroupsAllActive = Obj.GroupsAllActive;\n" 3293 " }\n" 3294 " else\n" 3295 " {\n" 3296 " GroupsAllActive = 1;\n" 3297 " }\n" 3298 " if(Obj.GroupsActive)\n" 3299 " {\n" 3300 " GroupsActive = Obj.GroupsActive;\n" 3301 " }\n" 3302 " if(Obj.nContextSwitchEnabled)\n" 3303 " {\n" 3304 " nContextSwitchEnabled = Obj.nContextSwitchEnabled; \n" 3305 " }\n" 3306 " else\n" 3307 " {\n" 3308 " nContextSwitchEnabled = 1;\n" 3309 " }\n" 3310 " if(Obj.GroupColors)\n" 3311 " {\n" 3312 " GroupColors = Obj.GroupColors;\n" 3313 " }\n" 3314 " else\n" 3315 " {\n" 3316 " GroupColors = 0;\n" 3317 " }\n" 3318 " if(Obj.nHideHelp)\n" 3319 " {\n" 3320 " nHideHelp = 1;\n" 3321 " }\n" 3322 " TimersGroups = Obj.TimersGroups?Obj.TimersGroups:0;\n" 3323 " TimersMeta = Obj.TimersMeta?0:1;\n" 3324 " }\n" 3325 " SetContextSwitch(nContextSwitchEnabled);\n" 3326 " SetMode(NewMode, TimersGroups);\n" 3327 " SetReferenceTime(ReferenceTimeString);\n" 3328 " UpdateOptionsMenu();\n" 3329 " UpdateGroupColors();\n" 3330 "}\n" 3331 "function WriteCookie()\n" 3332 "{\n" 3333 " var Obj = new Object();\n" 3334 " Obj.Mode = Mode;\n" 3335 " Obj.ReferenceTime = ReferenceTime + \'ms\';\n" 3336 " Obj.ThreadsActive = ThreadsActive;\n" 3337 " Obj.ThreadsAllActive = ThreadsAllActive;\n" 3338 " Obj.GroupsActive = GroupsActive;\n" 3339 " Obj.GroupsAllActive = GroupsAllActive;\n" 3340 " Obj.nContextSwitchEnabled = nContextSwitchEnabled;\n" 3341 " Obj.TimersGroups = TimersGroups?TimersGroups:0;\n" 3342 " Obj.TimersMeta = TimersMeta?0:1;\n" 3343 " Obj.GroupColors = GroupColors;\n" 3344 " if(nHideHelp)\n" 3345 " {\n" 3346 " Obj.nHideHelp = 1;\n" 3347 " }\n" 3348 " var date = new Date();\n" 3349 " date.setFullYear(2099);\n" 3350 " var cookie = \'fisk=\' + JSON.stringify(Obj) + \';expires=\' + date;\n" 3351 " document.cookie = cookie;\n" 3352 "}\n" 3353 "\n" 3354 "var mousewheelevt = (/Firefox/i.test(navigator.userAgent)) ? \"DOMMouseScroll\" : \"mousewheel\" //FF doesn\'t recognize mousewheel as of FF3.x\n" 3355 "\n" 3356 "CanvasDetailedView.addEventListener(\'mousemove\', MouseMove, false);\n" 3357 "CanvasDetailedView.addEventListener(\'mousedown\', function(evt) { MouseButton(true, evt); });\n" 3358 "CanvasDetailedView.addEventListener(\'mouseup\', function(evt) { MouseButton(false, evt); } );\n" 3359 "CanvasDetailedView.addEventListener(\'mouseout\', MouseOut);\n" 3360 "CanvasDetailedView.addEventListener(\"contextmenu\", function (e) { e.preventDefault(); }, false);\n" 3361 "CanvasDetailedView.addEventListener(mousewheelevt, MouseWheel, false);\n" 3362 "CanvasHistory.addEventListener(\'mousemove\', MouseMove);\n" 3363 "CanvasHistory.addEventListener(\'mousedown\', function(evt) { MouseButton(true, evt); });\n" 3364 "CanvasHistory.addEventListener(\'mouseup\', function(evt) { MouseButton(false, evt); } );\n" 3365 "CanvasHistory.addEventListener(\'mouseout\', MouseOut);\n" 3366 "CanvasHistory.addEventListener(\"contextmenu\", function (e) { e.preventDefault(); }, false);\n" 3367 "CanvasHistory.addEventListener(mousewheelevt, MouseWheel, false);\n" 3368 "window.addEventListener(\'keydown\', KeyDown);\n" 3369 "window.addEventListener(\'keyup\', KeyUp);\n" 3370 "window.addEventListener(\'resize\', ResizeCanvas, false);\n" 3371 "\n" 3372 "function CalcAverage()\n" 3373 "{\n" 3374 " var Sum = 0;\n" 3375 " var Count = 0;\n" 3376 " for(nLog = 0; nLog < nNumLogs; nLog++)\n" 3377 " {\n" 3378 " StackPos = 0;\n" 3379 " for(var i = 0; i < Frames.length; i++)\n" 3380 " {\n" 3381 " var Frame_ = Frames[i]; \n" 3382 " var tt = Frame_.tt[nLog];\n" 3383 " var ts = Frame_.ts[nLog];\n" 3384 "\n" 3385 " var count = tt.length;\n" 3386 " for(var j = 0; j < count; j++)\n" 3387 " {\n" 3388 " var type = tt[j];\n" 3389 " var time = ts[j];\n" 3390 " if(type == 1)\n" 3391 " {\n" 3392 " Stack[StackPos] = time;//store the frame which it comes from\n" 3393 " StackPos++;\n" 3394 " }\n" 3395 " else if(type == 0)\n" 3396 " {\n" 3397 " if(StackPos>0)\n" 3398 " {\n" 3399 "\n" 3400 " StackPos--;\n" 3401 " var localtime = time - Stack[StackPos];\n" 3402 " Count++;\n" 3403 " Sum += localtime;\n" 3404 " }\n" 3405 " }\n" 3406 " }\n" 3407 " }\n" 3408 " }\n" 3409 " return Sum / Count;\n" 3410 "\n" 3411 "}\n" 3412 "\n" 3413 "function MakeLod(index, MinDelta, TimeArray, TypeArray, IndexArray, LogStart)\n" 3414 "{\n" 3415 " if(LodData[index])\n" 3416 " {\n" 3417 " console.log(\"error!!\");\n" 3418 " }\n" 3419 " // debugger;\n" 3420 " var o = new Object();\n" 3421 " o.MinDelta = MinDelta;\n" 3422 " o.TimeArray = TimeArray;\n" 3423 " o.TypeArray = TypeArray;\n" 3424 " o.IndexArray = IndexArray;\n" 3425 " o.LogStart = LogStart;\n" 3426 " LodData[index] = o;\n" 3427 "}\n" 3428 "\n" 3429 "function PreprocessBuildSplitArray()\n" 3430 "{\n" 3431 " var nNumLogs = Frames[0].ts.length;\n" 3432 "\n" 3433 " ProfileEnter(\"PreprocessBuildSplitArray\");\n" 3434 " var SplitArrays = new Array(nNumLogs);\n" 3435 "\n" 3436 " for(nLog = 0; nLog < nNumLogs; ++nLog)\n" 3437 " {\n" 3438 " console.log(\"source log \" + nLog + \" size \" + LodData[0].TypeArray[nLog].length);\n" 3439 " }\n" 3440 "\n" 3441 "\n" 3442 " for(nLog = 0; nLog < nNumLogs; nLog++)\n" 3443 " {\n" 3444 " var MaxDepth = 1;\n" 3445 " var StackPos = 0;\n" 3446 " var Stack = Array(20);\n" 3447 " var TypeArray = LodData[0].TypeArray[nLog];\n" 3448 " var TimeArray = LodData[0].TimeArray[nLog];\n" 3449 " var DeltaTimes = new Array(TypeArray.length);\n" 3450 "\n" 3451 " for(var j = 0; j < TypeArray.length; ++j)\n" 3452 " {\n" 3453 " var type = TypeArray[j];\n" 3454 " var time = TimeArray[j];\n" 3455 " if(type == 1)\n" 3456 " {\n" 3457 " //push\n" 3458 " Stack[StackPos] = time;\n" 3459 " StackPos++;\n" 3460 " }\n" 3461 " else if(type == 0)\n" 3462 " {\n" 3463 " if(StackPos>0)\n" 3464 " {\n" 3465 " StackPos--;\n" 3466 " DeltaTimes[j] = time - Stack[StackPos];\n" 3467 " }\n" 3468 " else\n" 3469 " {\n" 3470 " DeltaTimes[j] = 0;\n" 3471 " }\n" 3472 " }\n" 3473 " }\n" 3474 " DeltaTimes.sort(function(a,b){return b-a;});\n" 3475 " var SplitArray = Array(NumLodSplits);\n" 3476 " var SplitIndex = DeltaTimes.length;\n" 3477 "\n" 3478 " var j = 0;\n" 3479 " for(j = 0; j < NumLodSplits; ++j)\n" 3480 " {\n" 3481 " SplitIndex = Math.floor(SplitIndex / 2);\n" 3482 " while(SplitIndex > 0 && !DeltaTimes[SplitIndex])\n" 3483 " {\n" 3484 " SplitIndex--;\n" 3485 " }\n" 3486 " if(SplitIndex < SplitMin)\n" 3487 " {\n" 3488 " break;\n" 3489 " }\n" 3490 " //search.. if 0\n" 3491 " var SplitTime = DeltaTimes[SplitIndex];\n" 3492 " if(SplitTime>=0)\n" 3493 " {\n" 3494 " SplitArray[j] = SplitTime;\n" 3495 " }\n" 3496 " else\n" 3497 " {\n" 3498 " SplitArray[j] = SPLIT_LIMIT;\n" 3499 " }\n" 3500 " if(j>0)\n" 3501 " {\n" 3502 " console.assert(SplitArray[j-1] <= SplitArray[j], \"must be less\");\n" 3503 " }\n" 3504 "\n" 3505 " }\n" 3506 " for(; j < NumLodSplits; ++j)\n" 3507 " {\n" 3508 " SplitArray[j] = SPLIT_LIMIT;\n" 3509 " // console.log(\"split skipping \" + j + \" \" + SPLIT_LIMIT);\n" 3510 " }\n" 3511 "\n" 3512 "\n" 3513 " SplitArrays[nLog] = SplitArray;\n" 3514 " }\n" 3515 " ProfileLeave();\n" 3516 " return SplitArrays;\n" 3517 "}\n" 3518 "\n" 3519 "function PreprocessBuildDurationArray()\n" 3520 "{\n" 3521 " var nNumLogs = Frames[0].ts.length;\n" 3522 " ProfileEnter(\"PreprocessBuildDurationArray\");\n" 3523 " var DurationArrays = new Array(nNumLogs);\n" 3524 " for(nLog = 0; nLog < nNumLogs; ++nLog)\n" 3525 " {\n" 3526 " var MaxDepth = 1;\n" 3527 " var StackPos = 0;\n" 3528 " var Stack = Array(20);\n" 3529 " var StackIndex = Array(20);\n" 3530 " var TypeArray = LodData[0].TypeArray[nLog];\n" 3531 " var TimeArray = LodData[0].TimeArray[nLog];\n" 3532 " var DurationArray = Array(LodData[0].TypeArray[nLog].length);\n" 3533 " for(var j = 0; j < TypeArray.length; ++j)\n" 3534 " {\n" 3535 " var type = TypeArray[j];\n" 3536 " var time = TimeArray[j];\n" 3537 " if(type == 1)\n" 3538 " {\n" 3539 " //push\n" 3540 " Stack[StackPos] = time;\n" 3541 " StackIndex[StackPos] = j;\n" 3542 " StackPos++;\n" 3543 " }\n" 3544 " else if(type == 0)\n" 3545 " {\n" 3546 " if(StackPos>0)\n" 3547 " {\n" 3548 " StackPos--;\n" 3549 " var Duration = time - Stack[StackPos];\n" 3550 " DurationArray[StackIndex[StackPos]] = Duration;\n" 3551 " DurationArray[j] = Duration;\n" 3552 " }\n" 3553 " else\n" 3554 " {\n" 3555 " DurationArray[j] = 0;\n" 3556 " }\n" 3557 " }\n" 3558 " }\n" 3559 " for(var j = 0; j < StackPos; ++j)\n" 3560 " {\n" 3561 " DurationArray[j] = 0;\n" 3562 " }\n" 3563 " DurationArrays[nLog] = DurationArray;\n" 3564 " }\n" 3565 " ProfileLeave();\n" 3566 " return DurationArrays;\n" 3567 "\n" 3568 "}\n" 3569 "function PreprocessLods()\n" 3570 "{\n" 3571 " ProfileEnter(\"PreprocessLods\");\n" 3572 " var nNumLogs = Frames[0].ts.length;\n" 3573 " var SplitArrays = PreprocessBuildSplitArray();\n" 3574 " var DurationArrays = PreprocessBuildDurationArray();\n" 3575 " var Source = LodData[0];\n" 3576 " var SourceLogStart = Source.LogStart;\n" 3577 " var NumFrames = SourceLogStart.length;\n" 3578 "\n" 3579 " for(var i = 0; i < NumLodSplits-1; ++i)\n" 3580 " {\n" 3581 " var DestLogStart = Array(SourceLogStart.length);\n" 3582 " for(var j = 0; j < DestLogStart.length; ++j)\n" 3583 " {\n" 3584 " DestLogStart[j] = Array(nNumLogs);\n" 3585 " }\n" 3586 " var MinDelta = Array(nNumLogs);\n" 3587 " var TimeArray = Array(nNumLogs);\n" 3588 " var IndexArray = Array(nNumLogs);\n" 3589 " var TypeArray = Array(nNumLogs);\n" 3590 "\n" 3591 "\n" 3592 "\n" 3593 " for(nLog = 0; nLog < nNumLogs; ++nLog)\n" 3594 " {\n" 3595 " var SourceTypeArray = Source.TypeArray[nLog];\n" 3596 " var SourceTimeArray = Source.TimeArray[nLog];\n" 3597 " var SourceIndexArray = Source.IndexArray[nLog];\n" 3598 " var Duration = DurationArrays[nLog];\n" 3599 " console.assert(Duration.length == SourceTypeArray.length, \"must be equal!\");\n" 3600 " var SplitTime = SplitArrays[nLog][i];\n" 3601 "\n" 3602 " MinDelta[nLog] = SplitTime;\n" 3603 " if(SplitTime < SPLIT_LIMIT)\n" 3604 " {\n" 3605 " var SourceCount = SourceTypeArray.length;\n" 3606 " var DestTypeArray = Array();\n" 3607 " var DestTimeArray = Array();\n" 3608 " var DestIndexArray = Array();\n" 3609 " var RemapArray = Array(SourceCount);\n" 3610 " var DiscardLast = 0;\n" 3611 "\n" 3612 " for(var j = 0; j < SourceCount; ++j)\n" 3613 " {\n" 3614 " RemapArray[j] = DestTypeArray.length;\n" 3615 " if(Duration[j] >= SplitTime || (SourceTypeArray[j] == 3 && 0 == DiscardLast))\n" 3616 " {\n" 3617 " DiscardLast = 0;\n" 3618 " DestTypeArray.push(SourceTypeArray[j]);\n" 3619 " DestTimeArray.push(SourceTimeArray[j]);\n" 3620 " DestIndexArray.push(SourceIndexArray[j]);\n" 3621 " }\n" 3622 " else\n" 3623 " {\n" 3624 " DiscardLast = 1;\n" 3625 " }\n" 3626 " }\n" 3627 " TimeArray[nLog] = DestTimeArray;\n" 3628 " IndexArray[nLog] = DestIndexArray;\n" 3629 " TypeArray[nLog] = DestTypeArray;\n" 3630 " for(var j = 0; j < NumFrames; ++j)\n" 3631 " {\n" 3632 " var OldStart = SourceLogStart[j][nLog];\n" 3633 " var NewStart = RemapArray[OldStart];\n" 3634 " var FrameArray = DestLogStart[j];\n" 3635 " FrameArray[nLog] = NewStart;\n" 3636 " }\n" 3637 " }\n" 3638 " else\n" 3639 " {\n" 3640 "\n" 3641 " for(var j = 0; j < NumFrames; ++j)\n" 3642 " {\n" 3643 " var FrameArray = DestLogStart[j];\n" 3644 " \n" 3645 " FrameArray[nLog] = 0;\n" 3646 " }\n" 3647 "\n" 3648 " }\n" 3649 "\n" 3650 " }\n" 3651 " MakeLod(i+1, MinDelta, TimeArray, TypeArray, IndexArray, DestLogStart);\n" 3652 " }\n" 3653 " ProfileLeave();\n" 3654 "}\n" 3655 "function PreprocessGlobalArray()\n" 3656 "{\n" 3657 " ProfileEnter(\"PreprocessGlobalArray\");\n" 3658 " var nNumLogs = Frames[0].ts.length;\n" 3659 " var CaptureStart = Frames[0].framestart;\n" 3660 " var CaptureEnd = Frames[Frames.length-1].frameend;\n" 3661 " g_TypeArray = new Array(nNumLogs);\n" 3662 " g_TimeArray = new Array(nNumLogs);\n" 3663 " g_IndexArray = new Array(nNumLogs);\n" 3664 " var StackPos = 0;\n" 3665 " var Stack = Array(20);\n" 3666 " var LogStartArray = new Array(Frames.length);\n" 3667 " for(var i = 0; i < Frames.length; i++)\n" 3668 " {\n" 3669 " Frames[i].LogStart = new Array(nNumLogs); \n" 3670 " LogStartArray[i] = Frames[i].LogStart;\n" 3671 "\n" 3672 " Frames[i].LogEnd = new Array(nNumLogs);\n" 3673 " }\n" 3674 " var MinDelta = Array(nNumLogs);\n" 3675 " for(nLog = 0; nLog < nNumLogs; nLog++)\n" 3676 " {\n" 3677 " MinDelta[nLog] = 0;\n" 3678 " var Discard = 0;\n" 3679 " var TypeArray = new Array();\n" 3680 " var TimeArray = new Array();\n" 3681 " var IndexArray = new Array();\n" 3682 " for(var i = 0; i < Frames.length; i++)\n" 3683 " {\n" 3684 " var Frame_ = Frames[i]; \n" 3685 " Frame_.LogStart[nLog] = TimeArray.length;\n" 3686 " var FrameDiscard = Frame_.frameend + 33;//if timestamps are more than 33ms after current frame, we assume buffer has wrapped.\n" 3687 " var tt = Frame_.tt[nLog];\n" 3688 " var ts = Frame_.ts[nLog];\n" 3689 " var ti = Frame_.ti[nLog];\n" 3690 " var len = tt.length;\n" 3691 " var DiscardLast = 0;\n" 3692 " for(var xx = 0; xx < len; ++xx)\n" 3693 " {\n" 3694 " var Skip = (tt[i] == 3) ? DiscardLast : ts[xx] > FrameDiscard;\n" 3695 " if(Skip)\n" 3696 " {\n" 3697 " Discard++;\n" 3698 " DiscardLast = 1;\n" 3699 " }\n" 3700 " else\n" 3701 " {\n" 3702 " DiscardLast = 0;\n" 3703 " TypeArray.push(tt[xx]);\n" 3704 " TimeArray.push(ts[xx]);\n" 3705 " IndexArray.push(ti[xx]);\n" 3706 " }\n" 3707 " }\n" 3708 " Frame_.LogEnd[nLog] = TimeArray.length;\n" 3709 " }\n" 3710 " g_TypeArray[nLog] = TypeArray;\n" 3711 " g_TimeArray[nLog] = TimeArray;\n" 3712 " g_IndexArray[nLog] = IndexArray;\n" 3713 " if(Discard)\n" 3714 " {\n" 3715 " console.log(\'discarded \' + Discard + \' markers from \' + ThreadNames[nLog]);\n" 3716 " }\n" 3717 " }\n" 3718 " MakeLod(0, MinDelta, g_TimeArray, g_TypeArray, g_IndexArray, LogStartArray);\n" 3719 " ProfileLeave();\n" 3720 "}\n" 3721 "\n" 3722 "function PreprocessFindFirstFrames()\n" 3723 "{\n" 3724 " ProfileEnter(\"PreprocesFindFirstFrames\");\n" 3725 " //create arrays that show how far back we need to start search in order to get all markers.\n" 3726 " var nNumLogs = Frames[0].ts.length;\n" 3727 " for(var i = 0; i < Frames.length; i++)\n" 3728 " {\n" 3729 " Frames[i].FirstFrameIndex = new Array(nNumLogs);\n" 3730 " }\n" 3731 "\n" 3732 " var StackPos = 0;\n" 3733 " var Stack = Array(20);\n" 3734 " g_MaxStack = Array(nNumLogs);\n" 3735 " \n" 3736 " for(nLog = 0; nLog < nNumLogs; nLog++)\n" 3737 " {\n" 3738 " var MaxStack = 0;\n" 3739 " StackPos = 0;\n" 3740 " for(var i = 0; i < Frames.length; i++)\n" 3741 " {\n" 3742 " var Frame_ = Frames[i]; \n" 3743 " var tt = Frame_.tt[nLog];\n" 3744 " var count = tt.length;\n" 3745 "\n" 3746 " var FirstFrame = i;\n" 3747 " if(StackPos>0)\n" 3748 " {\n" 3749 " FirstFrame = Stack[0];\n" 3750 " }\n" 3751 " Frames[i].FirstFrameIndex[nLog] = FirstFrame;\n" 3752 "\n" 3753 " for(var j = 0; j < count; j++)\n" 3754 " {\n" 3755 " var type = tt[j];\n" 3756 " if(type == 1)\n" 3757 " {\n" 3758 " Stack[StackPos] = i;//store the frame which it comes from\n" 3759 " StackPos++;\n" 3760 " if(StackPos > MaxStack)\n" 3761 " {\n" 3762 " MaxStack = StackPos;\n" 3763 " }\n" 3764 " }\n" 3765 " else if(type == 0)\n" 3766 " {\n" 3767 " if(StackPos>0)\n" 3768 " {\n" 3769 " StackPos--;\n" 3770 " }\n" 3771 " }\n" 3772 " }\n" 3773 " }\n" 3774 " g_MaxStack[nLog] = MaxStack;\n" 3775 " }\n" 3776 " ProfileLeave();\n" 3777 "}\n" 3778 "function PreprocessMeta()\n" 3779 "{\n" 3780 " MetaLengths = Array(MetaNames.length);\n" 3781 " MetaLengthsAvg = Array(MetaNames.length);\n" 3782 " MetaLengthsMax = Array(MetaNames.length);\n" 3783 " for(var i = 0; i < MetaNames.length; ++i)\n" 3784 " {\n" 3785 " MetaLengths[i] = MetaNames[i].length+1;\n" 3786 " MetaLengthsAvg[i] = MetaNames[i].length+5;\n" 3787 " MetaLengthsMax[i] = MetaNames[i].length+5;\n" 3788 " if(MetaLengths[i]<12)\n" 3789 " MetaLengths[i] = 12;\n" 3790 " if(MetaLengthsAvg[i]<12)\n" 3791 " MetaLengthsAvg[i] = 12;\n" 3792 " if(MetaLengthsMax[i]<12)\n" 3793 " MetaLengthsMax[i] = 12;\n" 3794 " }\n" 3795 " for(var i = 0; i < TimerInfo.length; ++i)\n" 3796 " {\n" 3797 " var Timer = TimerInfo[i];\n" 3798 " for(var j = 0; j < MetaNames.length; ++j)\n" 3799 " {\n" 3800 " var Len = FormatMeta(Timer.meta[j],0).length + 2;\n" 3801 " var LenAvg = FormatMeta(Timer.meta[j],2).length + 2;\n" 3802 " var LenMax = FormatMeta(Timer.meta[j],0).length + 2;\n" 3803 " if(Len > MetaLengths[j])\n" 3804 " {\n" 3805 " MetaLengths[j] = Len;\n" 3806 " }\n" 3807 " if(LenAvg > MetaLengthsAvg[j])\n" 3808 " {\n" 3809 " MetaLengthsAvg[j] = LenAvg;\n" 3810 " }\n" 3811 " if(LenMax > MetaLengthsMax[j])\n" 3812 " {\n" 3813 " MetaLengthsMax[j] = LenMax;\n" 3814 " }\n" 3815 " }\n" 3816 " }\n" 3817 "}\n" 3818 "\n" 3819 "function Preprocess()\n" 3820 "{\n" 3821 " var ProfileModeOld = ProfileMode;\n" 3822 " ProfileMode = 1;\n" 3823 " ProfileModeClear();\n" 3824 " ProfileEnter(\"Preprocess\");\n" 3825 " PreprocessCalculateAllTimers();\n" 3826 " PreprocessFindFirstFrames();\n" 3827 " PreprocessGlobalArray();\n" 3828 " PreprocessLods();\n" 3829 " PreprocessMeta();\n" 3830 " PreprocessContextSwitchCache();\n" 3831 " ProfileLeave();\n" 3832 " ProfileModeDump();\n" 3833 " ProfileMode = ProfileModeOld;\n" 3834 " Initialized = 1;\n" 3835 "}\n" 3836 "\n" 3837 "InitGroups();\n" 3838 "ReadCookie();\n" 3839 "MeasureFont()\n" 3840 "InitThreadMenu();\n" 3841 "InitGroupMenu();\n" 3842 "InitFrameInfo();\n" 3843 "UpdateThreadMenu();\n" 3844 "ResizeCanvas();\n" 3845 "Preprocess();\n" 3846 "OnPageReady();\n" 3847 "Draw(1);\n" 3848 "AutoRedraw();\n" 3849 "\n" 3850 "</script>\n" 3851 "</body>\n" 3852 "</html> "; 3853 3854 const size_t g_MicroProfileHtml_end_2_size = sizeof(g_MicroProfileHtml_end_2); 3855 const char* g_MicroProfileHtml_end[] = { 3856 &g_MicroProfileHtml_end_0[0], 3857 &g_MicroProfileHtml_end_1[0], 3858 &g_MicroProfileHtml_end_2[0], 3859 }; 3860 size_t g_MicroProfileHtml_end_sizes[] = { 3861 sizeof(g_MicroProfileHtml_end_0), 3862 sizeof(g_MicroProfileHtml_end_1), 3863 sizeof(g_MicroProfileHtml_end_2), 3864 }; 3865 size_t g_MicroProfileHtml_end_count = 3; 3866 #endif //MICROPROFILE_EMBED_HTML 3867 3868 ///end file generated from microprofile.html 3869