OLD | NEW |
---|---|
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 /** @typedef {!{ | 5 /** @typedef {!{ |
6 bounds: {height: number, width: number}, | 6 bounds: {height: number, width: number}, |
7 children: Array.<!WebInspector.TracingLayerPayload>, | 7 children: Array.<!WebInspector.TracingLayerPayload>, |
8 layer_id: number, | 8 layer_id: number, |
9 position: Array.<number>, | 9 position: Array.<number>, |
10 scroll_offset: Array.<number>, | 10 scroll_offset: Array.<number>, |
11 layer_quad: Array.<number>, | 11 layer_quad: Array.<number>, |
12 draws_content: number, | 12 draws_content: number, |
13 gpu_memory_usage: number, | 13 gpu_memory_usage: number, |
14 transform: Array.<number>, | 14 transform: Array.<number>, |
15 owner_node: number, | 15 owner_node: number, |
16 compositing_reasons: Array.<string> | 16 compositing_reasons: Array.<string> |
17 }} | 17 }} |
18 */ | 18 */ |
19 WebInspector.TracingLayerPayload; | 19 WebInspector.TracingLayerPayload; |
20 | 20 |
21 /** @typedef {!{ | 21 /** @typedef {!{ |
22 id: string, | 22 id: string, |
23 layer_id: string, | 23 layer_id: string, |
24 gpu_memory_usage: number, | 24 gpu_memory_usage: number, |
25 content_rect: !Array.<number> | 25 content_rect: !Array.<number> |
26 }} | 26 }} |
27 */ | 27 */ |
28 WebInspector.TracingLayerTile; | 28 WebInspector.TracingLayerTile; |
29 | 29 |
30 /** @typedef {!{ | |
31 rect: !DOMAgent.Rect, | |
alph
2016/10/21 00:25:10
indent
| |
32 snapshot: !WebInspector.PaintProfilerSnapshot | |
33 }} | |
34 */ | |
35 WebInspector.SnapshotWithRect; | |
36 | |
30 /** | 37 /** |
31 * @constructor | 38 * @constructor |
32 * @extends {WebInspector.LayerTreeBase} | 39 * @extends {WebInspector.LayerTreeBase} |
33 * @param {?WebInspector.Target} target | 40 * @param {?WebInspector.Target} target |
34 */ | 41 */ |
35 WebInspector.TracingLayerTree = function(target) | 42 WebInspector.TracingLayerTree = function(target) |
36 { | 43 { |
37 WebInspector.LayerTreeBase.call(this, target); | 44 WebInspector.LayerTreeBase.call(this, target); |
38 /** @type {!Map.<string, !WebInspector.TracingLayerTile>} */ | 45 /** @type {!Map.<string, !WebInspector.TracingLayerTile>} */ |
39 this._tileById = new Map(); | 46 this._tileById = new Map(); |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
89 */ | 96 */ |
90 setTiles: function(tiles) | 97 setTiles: function(tiles) |
91 { | 98 { |
92 this._tileById = new Map(); | 99 this._tileById = new Map(); |
93 for (var tile of tiles) | 100 for (var tile of tiles) |
94 this._tileById.set(tile.id, tile); | 101 this._tileById.set(tile.id, tile); |
95 }, | 102 }, |
96 | 103 |
97 /** | 104 /** |
98 * @param {string} tileId | 105 * @param {string} tileId |
99 * @param {function(?DOMAgent.Rect, ?WebInspector.PaintProfilerSnapshot)} ca llback | 106 * @return {!Promise<?WebInspector.SnapshotWithRect>} |
100 */ | 107 */ |
101 pictureForRasterTile: function(tileId, callback) | 108 pictureForRasterTile: function(tileId) |
102 { | 109 { |
103 var tile = this._tileById.get("cc::Tile/" + tileId); | 110 var tile = this._tileById.get("cc::Tile/" + tileId); |
104 if (!tile) { | 111 if (!tile) { |
105 WebInspector.console.error(`Tile ${tileId} is missing`); | 112 WebInspector.console.error(`Tile ${tileId} is missing`); |
106 callback(null, null); | 113 return /** @type {!Promise<?WebInspector.SnapshotWithRect>} */ (Prom ise.resolve(null)); |
107 return; | |
108 } | 114 } |
109 var layer = this.layerById(tile.layer_id); | 115 var layer = this.layerById(tile.layer_id); |
110 if (!layer) { | 116 if (!layer) { |
111 WebInspector.console.error(`Layer ${tile.layer_id} for tile ${tileId } is not found`); | 117 WebInspector.console.error(`Layer ${tile.layer_id} for tile ${tileId } is not found`); |
112 callback(null, null); | 118 return /** @type {!Promise<?WebInspector.SnapshotWithRect>} */ (Prom ise.resolve(null)); |
113 return; | |
114 } | 119 } |
115 layer.pictureForRect(this.target(), tile.content_rect, callback); | 120 return layer.pictureForRect(this.target(), tile.content_rect); |
116 }, | 121 }, |
117 | 122 |
118 /** | 123 /** |
119 * @param {!Array<!WebInspector.LayerPaintEvent>} paints | 124 * @param {!Array<!WebInspector.LayerPaintEvent>} paints |
120 */ | 125 */ |
121 _setPaints: function(paints) | 126 _setPaints: function(paints) |
122 { | 127 { |
123 for (var i = 0; i < paints.length; ++i) { | 128 for (var i = 0; i < paints.length; ++i) { |
124 var layer = this._layersById[paints[i].layerId()]; | 129 var layer = this._layersById[paints[i].layerId()]; |
125 if (layer) | 130 if (layer) |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
393 * @return {number} | 398 * @return {number} |
394 */ | 399 */ |
395 gpuMemoryUsage: function() | 400 gpuMemoryUsage: function() |
396 { | 401 { |
397 return this._gpuMemoryUsage; | 402 return this._gpuMemoryUsage; |
398 }, | 403 }, |
399 | 404 |
400 /** | 405 /** |
401 * @param {!WebInspector.Target} target | 406 * @param {!WebInspector.Target} target |
402 * @param {!Array<number>} targetRect | 407 * @param {!Array<number>} targetRect |
403 * @param {function(?DOMAgent.Rect, ?WebInspector.PaintProfilerSnapshot)} ca llback | 408 * @return {!Promise<?{rect: !DOMAgent.Rect, snapshot: !WebInspector.PaintPr ofilerSnapshot}>} |
404 */ | 409 */ |
405 pictureForRect: function(target, targetRect, callback) | 410 pictureForRect: function(target, targetRect) |
406 { | 411 { |
407 var fetchPictureFragmentsBarrier = new CallbackBarrier(); | 412 return Promise.all(this._paints.map(paint => paint.picturePromise())).th en(pictures => { |
408 this._paints.forEach(paint => paint.loadPicture(fetchPictureFragmentsBar rier.createCallback(pictureLoaded))); | 413 var fragments = pictures.filter(picture => picture && rectsOverlap(p icture.rect, targetRect)) |
409 fetchPictureFragmentsBarrier.callWhenDone(allPicturesLoaded); | 414 .map(picture => ({x: picture.rect[0], y: picture.rect[1], pictur e: picture.serializedPicture})); |
415 if (!fragments.length) | |
416 return null; | |
417 var topLeft = fragments.reduce((acc, current) => ({x: Math.min(acc.x , current.x), y: Math.min(acc.y, current.y)}), {x: Infinity, y: Infinity}); | |
alph
2016/10/21 00:25:10
For the sake of performance I'd do it with two red
| |
418 // Rect is in layer content coordinates, make it relative to picture by offsetting to the top left corner. | |
419 var rect = {x: targetRect[0] - topLeft.x, y: targetRect[1] - topLeft .y, width: targetRect[2], height: targetRect[3]}; | |
420 return WebInspector.PaintProfilerSnapshot.loadFromFragments(target, fragments).then(snapshot => snapshot ? {rect: rect, snapshot: snapshot} : null); | |
421 }); | |
410 | 422 |
411 /** | 423 /** |
412 * @param {number} a1 | 424 * @param {number} a1 |
413 * @param {number} a2 | 425 * @param {number} a2 |
414 * @param {number} b1 | 426 * @param {number} b1 |
415 * @param {number} b2 | 427 * @param {number} b2 |
416 * @return {boolean} | 428 * @return {boolean} |
417 */ | 429 */ |
418 function segmentsOverlap(a1, a2, b1, b2) | 430 function segmentsOverlap(a1, a2, b1, b2) |
419 { | 431 { |
420 console.assert(a1 <= a2 && b1 <= b2, "segments should be specified a s ordered pairs"); | 432 console.assert(a1 <= a2 && b1 <= b2, "segments should be specified a s ordered pairs"); |
421 return a2 > b1 && a1 < b2; | 433 return a2 > b1 && a1 < b2; |
422 } | 434 } |
435 | |
423 /** | 436 /** |
424 * @param {!Array.<number>} a | 437 * @param {!Array.<number>} a |
425 * @param {!Array.<number>} b | 438 * @param {!Array.<number>} b |
426 * @return {boolean} | 439 * @return {boolean} |
427 */ | 440 */ |
428 function rectsOverlap(a, b) | 441 function rectsOverlap(a, b) |
429 { | 442 { |
430 return segmentsOverlap(a[0], a[0] + a[2], b[0], b[0] + b[2]) && segm entsOverlap(a[1], a[1] + a[3], b[1], b[1] + b[3]); | 443 return segmentsOverlap(a[0], a[0] + a[2], b[0], b[0] + b[2]) && segm entsOverlap(a[1], a[1] + a[3], b[1], b[1] + b[3]); |
431 } | 444 } |
432 | |
433 var x0 = Infinity; | |
434 var y0 = Infinity; | |
435 var fragments = []; | |
436 /** | |
437 * @param {?Array.<number>} rect | |
438 * @param {?string} picture | |
439 */ | |
440 function pictureLoaded(rect, picture) | |
441 { | |
442 if (!rect || !picture) | |
443 return; | |
444 if (!rectsOverlap(rect, targetRect)) | |
445 return; | |
446 var x = rect[0]; | |
447 var y = rect[1]; | |
448 x0 = Math.min(x0, x); | |
449 y0 = Math.min(y0, y); | |
450 fragments.push({x: x, y: y, picture: picture}); | |
451 } | |
452 | |
453 function allPicturesLoaded() | |
454 { | |
455 if (!fragments.length) { | |
456 callback(null, null); | |
457 return; | |
458 } | |
459 // Rect is in layer content coordinates, make it relative to picture by offsetting to the top left corner. | |
460 var rect = {x: targetRect[0] - x0, y: targetRect[1] - y0, width: tar getRect[2], height: targetRect[3]}; | |
461 WebInspector.PaintProfilerSnapshot.loadFromFragments(target, fragmen ts, callback.bind(null, rect)); | |
462 } | |
463 }, | 445 }, |
464 | 446 |
465 /** | 447 /** |
466 * @param {!Array.<number>} params | 448 * @param {!Array.<number>} params |
467 * @param {string} type | 449 * @param {string} type |
468 * @return {!Object} | 450 * @return {!Object} |
469 */ | 451 */ |
470 _scrollRectsFromParams: function(params, type) | 452 _scrollRectsFromParams: function(params, type) |
471 { | 453 { |
472 return {rect: {x: params[0], y: params[1], width: params[2], height: par ams[3]}, type: type}; | 454 return {rect: {x: params[0], y: params[1], width: params[2], height: par ams[3]}, type: type}; |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
507 | 489 |
508 /** | 490 /** |
509 * @override | 491 * @override |
510 * @return {boolean} | 492 * @return {boolean} |
511 */ | 493 */ |
512 drawsContent: function() | 494 drawsContent: function() |
513 { | 495 { |
514 return this._drawsContent; | 496 return this._drawsContent; |
515 } | 497 } |
516 } | 498 } |
OLD | NEW |