3 Copyright (c) 2013 The Chromium Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style license that can be
5 found in the LICENSE file.
8 <link rel="import" href="/cc/constants.html">
9 <link rel="import" href="/cc/chrome_browser.html">
10 <link rel="import" href="/cc/layer_impl.html">
11 <link rel="import" href="/tracing/trace_model/object_instance.html">
16 tv.exportTo('cc', function() {
18 var constants = cc.constants;
19 var ObjectSnapshot = tracing.trace_model.ObjectSnapshot;
24 function LayerTreeImplSnapshot() {
25 ObjectSnapshot.apply(this, arguments);
28 LayerTreeImplSnapshot.prototype = {
29 __proto__: ObjectSnapshot.prototype,
31 preInitialize: function() {
32 cc.preInitializeObject(this);
33 this.layerTreeHostImpl = undefined;
34 this.whichTree = undefined;
35 this.sourceFrameNumber = undefined;
38 initialize: function() {
39 cc.moveRequiredFieldsFromArgsToToplevel(
41 'renderSurfaceLayerList']);
42 if (this.args.sourceFrameNumber)
43 this.sourceFrameNumber = this.args.sourceFrameNumber;
44 this.rootLayer.layerTreeImpl = this;
46 if (this.args.swapPromiseTraceIds &&
47 this.args.swapPromiseTraceIds.length) {
48 this.tracedInputLatencies = [];
50 var ownProcess = this.objectInstance.parent;
51 var traceModel = ownProcess.model;
52 var chromeBrowser = new cc.ChromeBrowser(traceModel);
53 if (chromeBrowser.browserProcess === undefined)
56 // Convert all ids to InputLatency Async objects.
57 chromeBrowser.browserProcess.iterateAllEvents(function(event) {
58 if (!event.title || event.title.indexOf('InputLatency') !== 0)
60 for (var i = 0; i < this.args.swapPromiseTraceIds.length; i++) {
61 if (!event.args.data || !event.args.data.trace_id)
63 if (parseInt(event.args.data.trace_id) ===
64 this.args.swapPromiseTraceIds[i])
65 this.tracedInputLatencies.push(event);
71 get hasSourceFrameBeenDrawnBefore() {
72 if (this.whichTree == cc.constants.PENDING_TREE)
75 // Old chrome's don't produce sourceFrameNumber.
76 if (this.sourceFrameNumber === undefined)
79 var thisLTHI = this.layerTreeHostImpl;
80 var thisLTHIIndex = thisLTHI.objectInstance.snapshots.indexOf(
82 var prevLTHIIndex = thisLTHIIndex - 1;
83 if (prevLTHIIndex < 0 || prevLTHIIndex >= thisLTHI.objectInstance.snapshots.length)
85 var prevLTHI = thisLTHI.objectInstance.snapshots[prevLTHIIndex];
86 if (!prevLTHI.activeTree)
89 // Old chrome's don't produce sourceFrameNumber.
90 if (prevLTHI.activeTree.sourceFrameNumber === undefined)
92 return prevLTHI.activeTree.sourceFrameNumber == this.sourceFrameNumber;
96 var other = this.whichTree == constants.ACTIVE_TREE ?
97 constants.PENDING_TREE : constants.ACTIVE_TREE;
98 return this.layerTreeHostImpl.getTree(other);
101 get gpuMemoryUsageInBytes() {
103 this.iterLayers(function(layer) {
104 if (layer.gpuMemoryUsageInBytes !== undefined)
105 totalBytes += layer.gpuMemoryUsageInBytes;
110 iterLayers: function(func, thisArg) {
111 var visitedLayers = {};
112 function visitLayer(layer, depth, isMask, isReplica) {
113 if (visitedLayers[layer.layerId])
115 visitedLayers[layer.layerId] = true;
116 func.call(thisArg, layer, depth, isMask, isReplica);
117 if (layer.children) {
118 for (var i = 0; i < layer.children.length; i++)
119 visitLayer(layer.children[i], depth + 1);
122 visitLayer(layer.maskLayer, depth + 1, true, false);
123 if (layer.replicaLayer)
124 visitLayer(layer.replicaLayer, depth + 1, false, true);
126 visitLayer(this.rootLayer, 0, false, false);
128 findLayerWithId: function(id) {
129 var foundLayer = undefined;
130 function visitLayer(layer) {
131 if (layer.layerId == id)
134 this.iterLayers(visitLayer);
139 ObjectSnapshot.register('cc::LayerTreeImpl', LayerTreeImplSnapshot);
142 LayerTreeImplSnapshot: LayerTreeImplSnapshot