Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1589)

Unified Diff: Source/devtools/front_end/TimelinePanel.js

Issue 46663010: DevTools: Show GPU utilization bar on timeline (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Tune PID to hue magic const Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/devtools/front_end/TimelineModel.js ('k') | Source/devtools/front_end/TimelinePresentationModel.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/devtools/front_end/TimelinePanel.js
diff --git a/Source/devtools/front_end/TimelinePanel.js b/Source/devtools/front_end/TimelinePanel.js
index c723061055aa9419e8704f16a328e2cd8b9d388d..ed5e25cd90c659185108a7924a2b94d85c7c2c43 100644
--- a/Source/devtools/front_end/TimelinePanel.js
+++ b/Source/devtools/front_end/TimelinePanel.js
@@ -134,7 +134,11 @@ WebInspector.TimelinePanel = function()
this._adjustHeaderHeight();
this._mainThreadTasks = /** @type {!Array.<{startTime: number, endTime: number}>} */ ([]);
- this._cpuBarsElement = this._timelineGrid.gridHeaderElement.createChild("div", "timeline-cpu-bars");
+ this._gpuTasks = /** @type {!Array.<{startTime: number, endTime: number, pid: number}>} */ ([]);
+ var utilizationStripsElement = this._timelineGrid.gridHeaderElement.createChild("div", "timeline-utilization-strips vbox");
+ this._cpuBarsElement = utilizationStripsElement.createChild("div", "timeline-utilization-strip");
+ if (WebInspector.experimentsSettings.gpuTimeline.isEnabled())
+ this._gpuBarsElement = utilizationStripsElement.createChild("div", "timeline-utilization-strip gpu");
this._mainThreadMonitoringEnabled = WebInspector.settings.showCpuOnTimelineRuler.get();
WebInspector.settings.showCpuOnTimelineRuler.addChangeListener(this._showCpuOnTimelineRulerChanged, this);
@@ -150,7 +154,7 @@ WebInspector.TimelinePanel = function()
this._allRecordsCount = 0;
this._presentationModel.addFilter(new WebInspector.TimelineWindowFilter(this._overviewPane));
- this._presentationModel.addFilter(new WebInspector.TimelineCategoryFilter());
+ this._presentationModel.addFilter(new WebInspector.TimelineCategoryFilter());
this._presentationModel.addFilter(this._durationFilter);
}
@@ -166,7 +170,7 @@ WebInspector.TimelinePanel.prototype = {
var mainThreadMonitoringEnabled = WebInspector.settings.showCpuOnTimelineRuler.get();
if (this._mainThreadMonitoringEnabled !== mainThreadMonitoringEnabled) {
this._mainThreadMonitoringEnabled = mainThreadMonitoringEnabled;
- this._refreshMainThreadBars();
+ this._refreshAllUtilizationBars();
}
},
@@ -652,6 +656,15 @@ WebInspector.TimelinePanel.prototype = {
});
}
+ if (record.type === WebInspector.TimelineModel.RecordType.GPUTask) {
+ this._gpuTasks.push({
+ startTime: WebInspector.TimelineModel.startTimeInSeconds(record),
+ endTime: WebInspector.TimelineModel.endTimeInSeconds(record),
+ pid: record.data["ownerPID"]
+ });
+ return WebInspector.TimelineModel.startTimeInSeconds(record) < this._overviewPane.windowEndTime();
+ }
+
var records = this._presentationModel.addRecord(record);
this._allRecordsCount += records.length;
var hasVisibleRecords = false;
@@ -728,6 +741,8 @@ WebInspector.TimelinePanel.prototype = {
this._allRecordsCount = 0;
this._automaticallySizeWindow = true;
this._mainThreadTasks = [];
+ this._gpuTasks = [];
+ this._pidToHue = {};
},
elementsToRestoreScrollPositionsFor: function()
@@ -818,8 +833,7 @@ WebInspector.TimelinePanel.prototype = {
this._timelineGrid.updateDividers(this._calculator);
} else
this._timelineGrid.updateDividers(this._calculator);
- if (this._mainThreadMonitoringEnabled)
- this._refreshMainThreadBars();
+ this._refreshAllUtilizationBars();
}
if (this._memoryStatistics.visible())
this._memoryStatistics.refresh();
@@ -979,8 +993,23 @@ WebInspector.TimelinePanel.prototype = {
return recordsInWindow.length;
},
- _refreshMainThreadBars: function()
+ _refreshAllUtilizationBars: function()
+ {
+ this._refreshUtilizationBars(WebInspector.UIString("CPU"), this._mainThreadMonitoringEnabled ? this._mainThreadTasks : [], this._cpuBarsElement);
+ if (WebInspector.experimentsSettings.gpuTimeline.isEnabled())
+ this._refreshUtilizationBars(WebInspector.UIString("GPU"), this._gpuTasks, this._gpuBarsElement);
+ },
+
+ /**
+ * @param {string} name
+ * @param {!Array.<{startTime: number, endTime: number, pid: number}>} tasks
+ * @param {?Element} container
+ */
+ _refreshUtilizationBars: function(name, tasks, container)
{
+ if (!container)
+ return;
+
const barOffset = 3;
const minGap = 3;
@@ -993,8 +1022,6 @@ WebInspector.TimelinePanel.prototype = {
var startTime = this._overviewPane.windowStartTime() - this._timelinePaddingLeft * scale;
var endTime = startTime + width * scale;
- var tasks = this._mainThreadMonitoringEnabled ? this._mainThreadTasks : [];
-
/**
* @param {number} value
* @param {{startTime: number, endTime: number}} task
@@ -1007,12 +1034,15 @@ WebInspector.TimelinePanel.prototype = {
var taskIndex = insertionIndexForObjectInListSortedByFunction(startTime, tasks, compareEndTime);
- var container = this._cpuBarsElement;
var element = container.firstChild;
var lastElement;
var lastLeft;
var lastRight;
+ if (!this._pidToHue)
+ this._pidToHue = {};
+ var pidToHue = this._pidToHue;
+
for (; taskIndex < tasks.length; ++taskIndex) {
var task = tasks[taskIndex];
if (task.startTime > endTime)
@@ -1023,7 +1053,8 @@ WebInspector.TimelinePanel.prototype = {
if (lastElement) {
var gap = Math.floor(left) - Math.ceil(lastRight);
- if (gap < minGap) {
+ if (gap < minGap
+ && (!task.pid || tasks[lastElement._tasksInfo.firstTaskIndex].pid === task.pid)) {
lastRight = right;
lastElement._tasksInfo.lastTaskIndex = taskIndex;
continue;
@@ -1034,8 +1065,14 @@ WebInspector.TimelinePanel.prototype = {
if (!element)
element = container.createChild("div", "timeline-graph-bar");
+ if (task.pid) {
+ if (!(task.pid in pidToHue))
+ pidToHue[task.pid] = (Object.keys(pidToHue).length * 101) % 360;
+ var hue = pidToHue[task.pid];
+ element.style.backgroundColor = "hsla(" + hue + ",50%,50%,0.2)";
+ }
element.style.left = left + "px";
- element._tasksInfo = {tasks: tasks, firstTaskIndex: taskIndex, lastTaskIndex: taskIndex};
+ element._tasksInfo = {name: name, tasks: tasks, firstTaskIndex: taskIndex, lastTaskIndex: taskIndex};
lastLeft = left;
lastRight = right;
« no previous file with comments | « Source/devtools/front_end/TimelineModel.js ('k') | Source/devtools/front_end/TimelinePresentationModel.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698