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

Unified Diff: chrome/browser/resources/gpu_internals/timeline_track.js

Issue 7555005: Moving the contents of chrome://gpu Profiling to chrome://tracing. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 9 years, 4 months 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
Index: chrome/browser/resources/gpu_internals/timeline_track.js
diff --git a/chrome/browser/resources/gpu_internals/timeline_track.js b/chrome/browser/resources/gpu_internals/timeline_track.js
deleted file mode 100644
index 34db08db6aaa4584e0d05aa151f0876806b58980..0000000000000000000000000000000000000000
--- a/chrome/browser/resources/gpu_internals/timeline_track.js
+++ /dev/null
@@ -1,466 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-/**
- * @fileoverview Renders an array of slices into the provided div,
- * using a child canvas element. Uses a FastRectRenderer to draw only
- * the visible slices.
- */
-cr.define('gpu', function() {
-
- const palletteBase = [
- {r: 138, g: 113, b: 152},
- {r: 175, g: 112, b: 133},
- {r: 127, g: 135, b: 225},
- {r: 93, g: 81, b: 137},
- {r: 116, g: 143, b: 119},
- {r: 178, g: 214, b: 122},
- {r: 87, g: 109, b: 147},
- {r: 119, g: 155, b: 95},
- {r: 114, g: 180, b: 160},
- {r: 132, g: 85, b: 103},
- {r: 157, g: 210, b: 150},
- {r: 148, g: 94, b: 86},
- {r: 164, g: 108, b: 138},
- {r: 139, g: 191, b: 150},
- {r: 110, g: 99, b: 145},
- {r: 80, g: 129, b: 109},
- {r: 125, g: 140, b: 149},
- {r: 93, g: 124, b: 132},
- {r: 140, g: 85, b: 140},
- {r: 104, g: 163, b: 162},
- {r: 132, g: 141, b: 178},
- {r: 131, g: 105, b: 147},
- {r: 135, g: 183, b: 98},
- {r: 152, g: 134, b: 177},
- {r: 141, g: 188, b: 141},
- {r: 133, g: 160, b: 210},
- {r: 126, g: 186, b: 148},
- {r: 112, g: 198, b: 205},
- {r: 180, g: 122, b: 195},
- {r: 203, g: 144, b: 152}];
-
- function brighten(c) {
- return {r: Math.min(255, c.r + Math.floor(c.r * 0.45)),
- g: Math.min(255, c.g + Math.floor(c.g * 0.45)),
- b: Math.min(255, c.b + Math.floor(c.b * 0.45))};
- }
- function colorToString(c) {
- return 'rgb(' + c.r + ',' + c.g + ',' + c.b + ')';
- }
-
- const selectedIdBoost = palletteBase.length;
-
- const pallette = palletteBase.concat(palletteBase.map(brighten)).
- map(colorToString);
-
- var textWidthMap = { };
- function quickMeasureText(ctx, text) {
- var w = textWidthMap[text];
- if (!w) {
- w = ctx.measureText(text).width;
- textWidthMap[text] = w;
- }
- return w;
- }
-
- function addTrack(thisTrack, slices) {
- var track = new TimelineSliceTrack();
-
- track.heading = '';
- track.slices = slices;
- track.viewport = thisTrack.viewport_;
-
- thisTrack.tracks_.push(track);
- thisTrack.appendChild(track);
- }
-
- /**
- * Generic base class for timeline tracks
- */
- TimelineThreadTrack = cr.ui.define('div');
- TimelineThreadTrack.prototype = {
- __proto__: HTMLDivElement.prototype,
-
- decorate: function() {
- this.className = 'timeline-thread-track';
- },
-
- set thread(thread) {
- this.thread_ = thread;
- this.updateChildTracks_();
- },
-
- set viewport(v) {
- this.viewport_ = v;
- for (var i = 0; i < this.tracks_.length; i++)
- this.tracks_[i].viewport = v;
- this.invalidate();
- },
-
- invalidate: function() {
- if (this.parentNode)
- this.parentNode.invalidate();
- },
-
- onResize: function() {
- for (var i = 0; i < this.tracks_.length; i++)
- this.tracks_[i].onResize();
- },
-
- get firstCanvas() {
- if (this.tracks_.length)
- return this.tracks_[0].firstCanvas;
- return undefined;
- },
-
- redraw: function() {
- for (var i = 0; i < this.tracks_.length; i++)
- this.tracks_[i].redraw();
- },
-
- updateChildTracks_: function() {
- this.textContent = '';
- this.tracks_ = [];
- if (this.thread_) {
- for (var srI = 0; srI < this.thread_.nonNestedSubRows.length; ++srI) {
- addTrack(this, this.thread_.nonNestedSubRows[srI]);
- }
- for (var srI = 0; srI < this.thread_.subRows.length; ++srI) {
- addTrack(this, this.thread_.subRows[srI]);
- }
- if (this.tracks_.length > 0) {
- var tname = this.thread_.name || this.thread_.tid;
- this.tracks_[0].heading = this.thread_.parent.pid + ': ' +
- tname + ':';
- this.tracks_[0].tooltip = 'pid: ' + this.thread_.parent.pid +
- ', tid: ' + this.thread_.tid +
- (this.thread_.name ? ', name: ' + this.thread_.name : '');
- }
- }
- },
-
- /**
- * Picks a slice, if any, at a given location.
- * @param {number} wX X location to search at, in worldspace.
- * @param {number} wY Y location to search at, in offset space.
- * offset space.
- * @param {function():*} onHitCallback Callback to call with the slice,
- * if one is found.
- * @return {boolean} true if a slice was found, otherwise false.
- */
- pick: function(wX, wY, onHitCallback) {
- for (var i = 0; i < this.tracks_.length; i++) {
- var trackClientRect = this.tracks_[i].getBoundingClientRect();
- if (wY >= trackClientRect.top && wY < trackClientRect.bottom)
- return this.tracks_[i].pick(wX, onHitCallback);
- }
- return false;
- },
-
- /**
- * Finds slices intersecting the given interval.
- * @param {number} loWX Lower X bound of the interval to search, in
- * worldspace.
- * @param {number} hiWX Upper X bound of the interval to search, in
- * worldspace.
- * @param {number} loY Lower Y bound of the interval to search, in
- * offset space.
- * @param {number} hiY Upper Y bound of the interval to search, in
- * offset space.
- * @param {function():*} onHitCallback Function to call for each slice
- * intersecting the interval.
- */
- pickRange: function(loWX, hiWX, loY, hiY, onHitCallback) {
- for (var i = 0; i < this.tracks_.length; i++) {
- var trackClientRect = this.tracks_[i].getBoundingClientRect();
- var a = Math.max(loY, trackClientRect.top);
- var b = Math.min(hiY, trackClientRect.bottom);
- if (a <= b)
- this.tracks_[i].pickRange(loWX, hiWX, loY, hiY, onHitCallback);
- }
- }
- };
-
- /**
- * Creates a new timeline track div element
- * @constructor
- * @extends {HTMLDivElement}
- */
- TimelineSliceTrack = cr.ui.define('div');
-
- TimelineSliceTrack.prototype = {
- __proto__: HTMLDivElement.prototype,
-
- decorate: function() {
- this.className = 'timeline-slice-track';
- this.slices_ = null;
-
- this.headingDiv_ = document.createElement('div');
- this.headingDiv_.className = 'timeline-slice-track-title';
- this.appendChild(this.headingDiv_);
-
- this.canvasContainer_ = document.createElement('div');
- this.canvasContainer_.className = 'timeline-slice-track-canvas-container';
- this.appendChild(this.canvasContainer_);
- this.canvas_ = document.createElement('canvas');
- this.canvas_.className = 'timeline-slice-track-canvas';
- this.canvasContainer_.appendChild(this.canvas_);
-
- this.ctx_ = this.canvas_.getContext('2d');
- },
-
- set heading(text) {
- this.headingDiv_.textContent = text;
- },
-
- set tooltip(text) {
- this.headingDiv_.title = text;
- },
-
- set slices(slices) {
- this.slices_ = slices;
- this.invalidate();
- },
-
- set viewport(v) {
- this.viewport_ = v;
- this.invalidate();
- },
-
- invalidate: function() {
- if (this.parentNode)
- this.parentNode.invalidate();
- },
-
- get firstCanvas() {
- return this.canvas_;
- },
-
- onResize: function() {
- this.canvas_.width = this.canvasContainer_.clientWidth;
- this.canvas_.height = this.canvasContainer_.clientHeight;
- this.invalidate();
- },
-
- redraw: function() {
- if (!this.viewport_)
- return;
- var ctx = this.ctx_;
- var canvasW = this.canvas_.width;
- var canvasH = this.canvas_.height;
-
- ctx.clearRect(0, 0, canvasW, canvasH);
-
- // culling...
- var vp = this.viewport_;
- var pixWidth = vp.xViewVectorToWorld(1);
- var viewLWorld = vp.xViewToWorld(0);
- var viewRWorld = vp.xViewToWorld(canvasW);
-
- // Draw grid without a transform because the scale
- // affects line width.
- if (vp.gridEnabled) {
- var x = vp.gridTimebase;
- ctx.beginPath();
- while (x < viewRWorld) {
- if (x >= viewLWorld) {
- // Do conversion to viewspace here rather than on
- // x to avoid precision issues.
- var vx = vp.xWorldToView(x);
- ctx.moveTo(vx, 0);
- ctx.lineTo(vx, canvasH);
- }
- x += vp.gridStep;
- }
- ctx.strokeStyle = 'rgba(255,0,0,0.25)';
- ctx.stroke();
- }
-
- // begin rendering in world space
- ctx.save();
- vp.applyTransformToCanavs(ctx);
-
- // tracks
- var tr = new gpu.FastRectRenderer(ctx, viewLWorld, 2 * pixWidth,
- 2 * pixWidth, viewRWorld, pallette);
- tr.setYandH(0, canvasH);
- var slices = this.slices_;
- for (var i = 0; i < slices.length; ++i) {
- var slice = slices[i];
- var x = slice.start;
- // Less than 0.001 causes short events to disappear when zoomed in.
- var w = Math.max(slice.duration, 0.001);
- var colorId;
- colorId = slice.selected ?
- slice.colorId + selectedIdBoost :
- slice.colorId;
-
- if (w < pixWidth)
- w = pixWidth;
- if (slice.duration > 0) {
- tr.fillRect(x, w, colorId);
- } else {
- // Instant: draw a triangle. If zoomed too far, collapse
- // into the FastRectRenderer.
- if (pixWidth > 0.001) {
- tr.fillRect(x, pixWidth, colorId);
- } else {
- ctx.fillStyle = pallette[colorId];
- ctx.beginPath();
- ctx.moveTo(x - (4 * pixWidth), canvasH);
- ctx.lineTo(x, 0);
- ctx.lineTo(x + (4 * pixWidth), canvasH);
- ctx.closePath();
- ctx.fill();
- }
- }
- }
- tr.flush();
- ctx.restore();
-
- // labels
- ctx.textAlign = 'center';
- ctx.textBaseline = 'top';
- ctx.font = '10px sans-serif';
- ctx.strokeStyle = 'rgb(0,0,0)';
- ctx.fillStyle = 'rgb(0,0,0)';
- var quickDiscardThresshold = pixWidth * 20; // dont render until 20px wide
- for (var i = 0; i < slices.length; ++i) {
- var slice = slices[i];
- if (slice.duration > quickDiscardThresshold) {
- var title = slice.title;
- if (slice.didNotFinish) {
- title += ' (Did Not Finish)';
- }
- function labelWidth() {
- return quickMeasureText(ctx, title) + 2;
- }
- function labelWidthWorld() {
- return pixWidth * labelWidth();
- }
- var elided = false;
- while (labelWidthWorld() > slice.duration) {
- title = title.substring(0, title.length * 0.75);
- elided = true;
- }
- if (elided && title.length > 3)
- title = title.substring(0, title.length - 3) + '...';
- var cX = vp.xWorldToView(slice.start + 0.5 * slice.duration);
- ctx.fillText(title, cX, 2.5, labelWidthWorld());
- }
- }
- },
-
- /**
- * Picks a slice, if any, at a given location.
- * @param {number} wX X location to search at, in worldspace.
- * @param {number} wY Y location to search at, in offset space.
- * offset space.
- * @param {function():*} onHitCallback Callback to call with the slice,
- * if one is found.
- * @return {boolean} true if a slice was found, otherwise false.
- */
- pick: function(wX, wY, onHitCallback) {
- var clientRect = this.getBoundingClientRect();
- if (wY < clientRect.top || wY >= clientRect.bottom)
- return false;
- var x = gpu.findLowIndexInSortedIntervals(this.slices_,
- function(x) { return x.start; },
- function(x) { return x.duration; },
- wX);
- if (x >= 0 && x < this.slices_.length) {
- onHitCallback('slice', this, this.slices_[x]);
- return true;
- }
- return false;
- },
-
- /**
- * Finds slices intersecting the given interval.
- * @param {number} loWX Lower X bound of the interval to search, in
- * worldspace.
- * @param {number} hiWX Upper X bound of the interval to search, in
- * worldspace.
- * @param {number} loY Lower Y bound of the interval to search, in
- * offset space.
- * @param {number} hiY Upper Y bound of the interval to search, in
- * offset space.
- * @param {function():*} onHitCallback Function to call for each slice
- * intersecting the interval.
- */
- pickRange: function(loWX, hiWX, loY, hiY, onHitCallback) {
- var clientRect = this.getBoundingClientRect();
- var a = Math.max(loY, clientRect.top);
- var b = Math.min(hiY, clientRect.bottom);
- if (a > b)
- return;
-
- var that = this;
- function onPickHit(slice) {
- onHitCallback('slice', that, slice);
- }
- gpu.iterateOverIntersectingIntervals(this.slices_,
- function(x) { return x.start; },
- function(x) { return x.duration; },
- loWX, hiWX,
- onPickHit);
- },
-
- /**
- * Find the index for the given slice.
- * @return {index} Index of the given slice, or undefined.
- * @private
- */
- indexOfSlice_: function(slice) {
- var index = gpu.findLowIndexInSortedArray(this.slices_,
- function(x) { return x.start; },
- slice.start);
- while (index < this.slices_.length &&
- slice.start == this.slices_[index].start &&
- slice.colorId != this.slices_[index].colorId) {
- index++;
- }
- return index < this.slices_.length ? index : undefined;
- },
-
- /**
- * Return the next slice, if any, after the given slice.
- * @param {slice} The previous slice.
- * @return {slice} The next slice, or undefined.
- * @private
- */
- pickNext: function(slice) {
- var index = this.indexOfSlice_(slice);
- if (index != undefined) {
- if (index < this.slices_.length - 1)
- index++;
- else
- index = undefined;
- }
- return index != undefined ? this.slices_[index] : undefined;
- },
-
- /**
- * Return the previous slice, if any, before the given slice.
- * @param {slice} A slice.
- * @return {slice} The previous slice, or undefined.
- */
- pickPrevious: function(slice) {
- var index = this.indexOfSlice_(slice);
- if (index == 0)
- return undefined;
- else if ((index != undefined) && (index > 0))
- index--;
- return index != undefined ? this.slices_[index] : undefined;
- },
-
- };
-
- return {
- TimelineSliceTrack: TimelineSliceTrack,
- TimelineThreadTrack: TimelineThreadTrack
- };
-});
« no previous file with comments | « chrome/browser/resources/gpu_internals/timeline_model.js ('k') | chrome/browser/resources/gpu_internals/timeline_view.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698