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, |
| 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 x0 = fragments.reduce((min, item) => Math.min(min, item.x), Infi
nity); |
| 418 var y0 = fragments.reduce((min, item) => Math.min(min, item.y), Infi
nity); |
| 419 // Rect is in layer content coordinates, make it relative to picture
by offsetting to the top left corner. |
| 420 var rect = {x: targetRect[0] - x0, y: targetRect[1] - y0, width: tar
getRect[2], height: targetRect[3]}; |
| 421 return WebInspector.PaintProfilerSnapshot.loadFromFragments(target,
fragments).then(snapshot => snapshot ? {rect: rect, snapshot: snapshot} : null); |
| 422 }); |
410 | 423 |
411 /** | 424 /** |
412 * @param {number} a1 | 425 * @param {number} a1 |
413 * @param {number} a2 | 426 * @param {number} a2 |
414 * @param {number} b1 | 427 * @param {number} b1 |
415 * @param {number} b2 | 428 * @param {number} b2 |
416 * @return {boolean} | 429 * @return {boolean} |
417 */ | 430 */ |
418 function segmentsOverlap(a1, a2, b1, b2) | 431 function segmentsOverlap(a1, a2, b1, b2) |
419 { | 432 { |
420 console.assert(a1 <= a2 && b1 <= b2, "segments should be specified a
s ordered pairs"); | 433 console.assert(a1 <= a2 && b1 <= b2, "segments should be specified a
s ordered pairs"); |
421 return a2 > b1 && a1 < b2; | 434 return a2 > b1 && a1 < b2; |
422 } | 435 } |
| 436 |
423 /** | 437 /** |
424 * @param {!Array.<number>} a | 438 * @param {!Array.<number>} a |
425 * @param {!Array.<number>} b | 439 * @param {!Array.<number>} b |
426 * @return {boolean} | 440 * @return {boolean} |
427 */ | 441 */ |
428 function rectsOverlap(a, b) | 442 function rectsOverlap(a, b) |
429 { | 443 { |
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]); | 444 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 } | 445 } |
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 }, | 446 }, |
464 | 447 |
465 /** | 448 /** |
466 * @param {!Array.<number>} params | 449 * @param {!Array.<number>} params |
467 * @param {string} type | 450 * @param {string} type |
468 * @return {!Object} | 451 * @return {!Object} |
469 */ | 452 */ |
470 _scrollRectsFromParams: function(params, type) | 453 _scrollRectsFromParams: function(params, type) |
471 { | 454 { |
472 return {rect: {x: params[0], y: params[1], width: params[2], height: par
ams[3]}, type: type}; | 455 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 | 490 |
508 /** | 491 /** |
509 * @override | 492 * @override |
510 * @return {boolean} | 493 * @return {boolean} |
511 */ | 494 */ |
512 drawsContent: function() | 495 drawsContent: function() |
513 { | 496 { |
514 return this._drawsContent; | 497 return this._drawsContent; |
515 } | 498 } |
516 } | 499 } |
OLD | NEW |