OLD | NEW |
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
2 <!-- | 2 <!-- |
3 Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 4 Use of this source code is governed by a BSD-style license that can be |
5 found in the LICENSE file. | 5 found in the LICENSE file. |
6 --> | 6 --> |
7 | 7 |
8 <link rel="import" href="/tracing/extras/chrome/cc/constants.html"> | 8 <link rel="import" href="/tracing/extras/chrome/cc/constants.html"> |
9 <link rel="import" href="/tracing/extras/chrome/cc/layer_impl.html"> | 9 <link rel="import" href="/tracing/extras/chrome/cc/layer_impl.html"> |
10 <link rel="import" href="/tracing/model/helpers/chrome_model_helper.html"> | 10 <link rel="import" href="/tracing/model/helpers/chrome_model_helper.html"> |
(...skipping 21 matching lines...) Expand all Loading... |
32 this.layerTreeHostImpl = undefined; | 32 this.layerTreeHostImpl = undefined; |
33 this.whichTree = undefined; | 33 this.whichTree = undefined; |
34 this.sourceFrameNumber = undefined; | 34 this.sourceFrameNumber = undefined; |
35 }, | 35 }, |
36 | 36 |
37 initialize: function() { | 37 initialize: function() { |
38 tr.e.cc.moveRequiredFieldsFromArgsToToplevel( | 38 tr.e.cc.moveRequiredFieldsFromArgsToToplevel( |
39 this, ['renderSurfaceLayerList']); | 39 this, ['renderSurfaceLayerList']); |
40 tr.e.cc.moveOptionalFieldsFromArgsToToplevel( | 40 tr.e.cc.moveOptionalFieldsFromArgsToToplevel( |
41 this, ['rootLayer', 'layers']); | 41 this, ['rootLayer', 'layers']); |
42 if (this.args.sourceFrameNumber) | 42 if (this.args.sourceFrameNumber) { |
43 this.sourceFrameNumber = this.args.sourceFrameNumber; | 43 this.sourceFrameNumber = this.args.sourceFrameNumber; |
| 44 } |
44 | 45 |
45 // Slimming Paint v2 removes the tree hierarchy and replace | 46 // Slimming Paint v2 removes the tree hierarchy and replace |
46 // it with a layer list. The tracing data should have either | 47 // it with a layer list. The tracing data should have either |
47 // rootLayer or layers available. | 48 // rootLayer or layers available. |
48 if (this.rootLayer) { | 49 if (this.rootLayer) { |
49 // The version before SPv2 | 50 // The version before SPv2 |
50 this.rootLayer.layerTreeImpl = this; | 51 this.rootLayer.layerTreeImpl = this; |
51 } else { | 52 } else { |
52 // The SPv2 version, where the layer list contains all | 53 // The SPv2 version, where the layer list contains all |
53 // non-mask, non-replica layers. | 54 // non-mask, non-replica layers. |
54 for (var i = 0; i < this.layers.length; i++) { | 55 for (var i = 0; i < this.layers.length; i++) { |
55 this.layers[i].layerTreeImpl = this; | 56 this.layers[i].layerTreeImpl = this; |
56 } | 57 } |
57 } | 58 } |
58 | 59 |
59 if (this.args.swapPromiseTraceIds && | 60 if (this.args.swapPromiseTraceIds && |
60 this.args.swapPromiseTraceIds.length) { | 61 this.args.swapPromiseTraceIds.length) { |
61 this.tracedInputLatencies = []; | 62 this.tracedInputLatencies = []; |
62 | 63 |
63 var ownProcess = this.objectInstance.parent; | 64 var ownProcess = this.objectInstance.parent; |
64 var modelHelper = ownProcess.model.getOrCreateHelper( | 65 var modelHelper = ownProcess.model.getOrCreateHelper( |
65 tr.model.helpers.ChromeModelHelper); | 66 tr.model.helpers.ChromeModelHelper); |
66 if (modelHelper) | 67 if (modelHelper) { |
67 this._initializeTracedInputLatencies(modelHelper); | 68 this._initializeTracedInputLatencies(modelHelper); |
| 69 } |
68 } | 70 } |
69 }, | 71 }, |
70 | 72 |
71 _initializeTracedInputLatencies: function(modelHelper) { | 73 _initializeTracedInputLatencies: function(modelHelper) { |
72 var latencyEvents = modelHelper.browserHelper.getLatencyEventsInRange( | 74 var latencyEvents = modelHelper.browserHelper.getLatencyEventsInRange( |
73 modelHelper.model.bounds); | 75 modelHelper.model.bounds); |
74 | 76 |
75 // Convert all ids to InputLatency Async objects. | 77 // Convert all ids to InputLatency Async objects. |
76 latencyEvents.forEach(function(event) { | 78 latencyEvents.forEach(function(event) { |
77 for (var i = 0; i < this.args.swapPromiseTraceIds.length; i++) { | 79 for (var i = 0; i < this.args.swapPromiseTraceIds.length; i++) { |
78 if (!event.args.data || !event.args.data.trace_id) | 80 if (!event.args.data || !event.args.data.trace_id) { |
79 continue; | 81 continue; |
| 82 } |
80 if (parseInt(event.args.data.trace_id) === | 83 if (parseInt(event.args.data.trace_id) === |
81 this.args.swapPromiseTraceIds[i]) | 84 this.args.swapPromiseTraceIds[i]) { |
82 this.tracedInputLatencies.push(event); | 85 this.tracedInputLatencies.push(event); |
| 86 } |
83 } | 87 } |
84 }, this); | 88 }, this); |
85 }, | 89 }, |
86 | 90 |
87 get hasSourceFrameBeenDrawnBefore() { | 91 get hasSourceFrameBeenDrawnBefore() { |
88 if (this.whichTree === tr.e.cc.constants.PENDING_TREE) | 92 if (this.whichTree === tr.e.cc.constants.PENDING_TREE) { |
89 return false; | 93 return false; |
| 94 } |
90 | 95 |
91 // Old chrome's don't produce sourceFrameNumber. | 96 // Old chrome's don't produce sourceFrameNumber. |
92 if (this.sourceFrameNumber === undefined) | 97 if (this.sourceFrameNumber === undefined) return; |
93 return; | |
94 | 98 |
95 var thisLTHI = this.layerTreeHostImpl; | 99 var thisLTHI = this.layerTreeHostImpl; |
96 var thisLTHIIndex = thisLTHI.objectInstance.snapshots.indexOf( | 100 var thisLTHIIndex = thisLTHI.objectInstance.snapshots.indexOf( |
97 thisLTHI); | 101 thisLTHI); |
98 var prevLTHIIndex = thisLTHIIndex - 1; | 102 var prevLTHIIndex = thisLTHIIndex - 1; |
99 if (prevLTHIIndex < 0 || | 103 if (prevLTHIIndex < 0 || |
100 prevLTHIIndex >= thisLTHI.objectInstance.snapshots.length) | 104 prevLTHIIndex >= thisLTHI.objectInstance.snapshots.length) { |
101 return false; | 105 return false; |
| 106 } |
102 var prevLTHI = thisLTHI.objectInstance.snapshots[prevLTHIIndex]; | 107 var prevLTHI = thisLTHI.objectInstance.snapshots[prevLTHIIndex]; |
103 if (!prevLTHI.activeTree) | 108 if (!prevLTHI.activeTree) return false; |
104 return false; | |
105 | 109 |
106 // Old chrome's don't produce sourceFrameNumber. | 110 // Old chrome's don't produce sourceFrameNumber. |
107 if (prevLTHI.activeTree.sourceFrameNumber === undefined) | 111 if (prevLTHI.activeTree.sourceFrameNumber === undefined) return; |
108 return; | |
109 return prevLTHI.activeTree.sourceFrameNumber === this.sourceFrameNumber; | 112 return prevLTHI.activeTree.sourceFrameNumber === this.sourceFrameNumber; |
110 }, | 113 }, |
111 | 114 |
112 get otherTree() { | 115 get otherTree() { |
113 var other = this.whichTree === constants.ACTIVE_TREE ? | 116 var other = this.whichTree === constants.ACTIVE_TREE ? |
114 constants.PENDING_TREE : constants.ACTIVE_TREE; | 117 constants.PENDING_TREE : constants.ACTIVE_TREE; |
115 return this.layerTreeHostImpl.getTree(other); | 118 return this.layerTreeHostImpl.getTree(other); |
116 }, | 119 }, |
117 | 120 |
118 get gpuMemoryUsageInBytes() { | 121 get gpuMemoryUsageInBytes() { |
119 var totalBytes = 0; | 122 var totalBytes = 0; |
120 this.iterLayers(function(layer) { | 123 this.iterLayers(function(layer) { |
121 if (layer.gpuMemoryUsageInBytes !== undefined) | 124 if (layer.gpuMemoryUsageInBytes !== undefined) { |
122 totalBytes += layer.gpuMemoryUsageInBytes; | 125 totalBytes += layer.gpuMemoryUsageInBytes; |
| 126 } |
123 }); | 127 }); |
124 return totalBytes; | 128 return totalBytes; |
125 }, | 129 }, |
126 | 130 |
127 iterLayers: function(func, thisArg) { | 131 iterLayers: function(func, thisArg) { |
128 var visitedLayers = {}; | 132 var visitedLayers = {}; |
129 function visitLayer(layer, depth, isMask, isReplica) { | 133 function visitLayer(layer, depth, isMask, isReplica) { |
130 if (visitedLayers[layer.layerId]) | 134 if (visitedLayers[layer.layerId]) return; |
131 return; | 135 |
132 visitedLayers[layer.layerId] = true; | 136 visitedLayers[layer.layerId] = true; |
133 func.call(thisArg, layer, depth, isMask, isReplica); | 137 func.call(thisArg, layer, depth, isMask, isReplica); |
134 if (layer.children) { | 138 if (layer.children) { |
135 for (var i = 0; i < layer.children.length; i++) | 139 for (var i = 0; i < layer.children.length; i++) { |
136 visitLayer(layer.children[i], depth + 1); | 140 visitLayer(layer.children[i], depth + 1); |
| 141 } |
137 } | 142 } |
138 if (layer.maskLayer) | 143 if (layer.maskLayer) { |
139 visitLayer(layer.maskLayer, depth + 1, true, false); | 144 visitLayer(layer.maskLayer, depth + 1, true, false); |
140 if (layer.replicaLayer) | 145 } |
| 146 if (layer.replicaLayer) { |
141 visitLayer(layer.replicaLayer, depth + 1, false, true); | 147 visitLayer(layer.replicaLayer, depth + 1, false, true); |
| 148 } |
142 } | 149 } |
143 if (this.rootLayer) { | 150 if (this.rootLayer) { |
144 visitLayer(this.rootLayer, 0, false, false); | 151 visitLayer(this.rootLayer, 0, false, false); |
145 } else { | 152 } else { |
146 for (var i = 0; i < this.layers.length; i++) | 153 for (var i = 0; i < this.layers.length; i++) { |
147 visitLayer(this.layers[i], 0, false, false); | 154 visitLayer(this.layers[i], 0, false, false); |
| 155 } |
148 } | 156 } |
149 }, | 157 }, |
150 findLayerWithId: function(id) { | 158 findLayerWithId: function(id) { |
151 var foundLayer = undefined; | 159 var foundLayer = undefined; |
152 function visitLayer(layer) { | 160 function visitLayer(layer) { |
153 if (layer.layerId === id) | 161 if (layer.layerId === id) { |
154 foundLayer = layer; | 162 foundLayer = layer; |
| 163 } |
155 } | 164 } |
156 this.iterLayers(visitLayer); | 165 this.iterLayers(visitLayer); |
157 return foundLayer; | 166 return foundLayer; |
158 } | 167 } |
159 }; | 168 }; |
160 | 169 |
161 ObjectSnapshot.subTypes.register( | 170 ObjectSnapshot.subTypes.register( |
162 LayerTreeImplSnapshot, | 171 LayerTreeImplSnapshot, |
163 {typeName: 'cc::LayerTreeImpl'}); | 172 {typeName: 'cc::LayerTreeImpl'}); |
164 | 173 |
165 return { | 174 return { |
166 LayerTreeImplSnapshot, | 175 LayerTreeImplSnapshot, |
167 }; | 176 }; |
168 }); | 177 }); |
169 </script> | 178 </script> |
OLD | NEW |