Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / third_party / trace-viewer / trace_viewer / cc / layer_tree_impl.html
1 <!DOCTYPE html>
2 <!--
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.
6 -->
7
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">
12
13 <script>
14 'use strict';
15
16 tv.exportTo('cc', function() {
17
18   var constants = cc.constants;
19   var ObjectSnapshot = tracing.trace_model.ObjectSnapshot;
20
21   /**
22    * @constructor
23    */
24   function LayerTreeImplSnapshot() {
25     ObjectSnapshot.apply(this, arguments);
26   }
27
28   LayerTreeImplSnapshot.prototype = {
29     __proto__: ObjectSnapshot.prototype,
30
31     preInitialize: function() {
32       cc.preInitializeObject(this);
33       this.layerTreeHostImpl = undefined;
34       this.whichTree = undefined;
35       this.sourceFrameNumber = undefined;
36     },
37
38     initialize: function() {
39       cc.moveRequiredFieldsFromArgsToToplevel(
40           this, ['rootLayer',
41             'renderSurfaceLayerList']);
42       if (this.args.sourceFrameNumber)
43         this.sourceFrameNumber = this.args.sourceFrameNumber;
44       this.rootLayer.layerTreeImpl = this;
45
46       if (this.args.swapPromiseTraceIds &&
47           this.args.swapPromiseTraceIds.length) {
48         this.tracedInputLatencies = [];
49
50         var ownProcess = this.objectInstance.parent;
51         var traceModel = ownProcess.model;
52         var chromeBrowser = new cc.ChromeBrowser(traceModel);
53         if (chromeBrowser.browserProcess === undefined)
54           return;
55
56         // Convert all ids to InputLatency Async objects.
57         chromeBrowser.browserProcess.iterateAllEvents(function(event) {
58           if (!event.title || event.title.indexOf('InputLatency') !== 0)
59             return;
60           for (var i = 0; i < this.args.swapPromiseTraceIds.length; i++) {
61             if (!event.args.data || !event.args.data.trace_id)
62               continue;
63             if (parseInt(event.args.data.trace_id) ===
64                 this.args.swapPromiseTraceIds[i])
65               this.tracedInputLatencies.push(event);
66           }
67         }.bind(this));
68       }
69     },
70
71     get hasSourceFrameBeenDrawnBefore() {
72       if (this.whichTree == cc.constants.PENDING_TREE)
73         return false;
74
75       // Old chrome's don't produce sourceFrameNumber.
76       if (this.sourceFrameNumber === undefined)
77         return;
78
79       var thisLTHI = this.layerTreeHostImpl;
80       var thisLTHIIndex = thisLTHI.objectInstance.snapshots.indexOf(
81         thisLTHI);
82       var prevLTHIIndex = thisLTHIIndex - 1;
83       if (prevLTHIIndex < 0 || prevLTHIIndex >= thisLTHI.objectInstance.snapshots.length)
84         return false;
85       var prevLTHI = thisLTHI.objectInstance.snapshots[prevLTHIIndex];
86       if (!prevLTHI.activeTree)
87         return false;
88
89       // Old chrome's don't produce sourceFrameNumber.
90       if (prevLTHI.activeTree.sourceFrameNumber === undefined)
91         return;
92       return prevLTHI.activeTree.sourceFrameNumber == this.sourceFrameNumber;
93     },
94
95     get otherTree() {
96       var other = this.whichTree == constants.ACTIVE_TREE ?
97           constants.PENDING_TREE : constants.ACTIVE_TREE;
98       return this.layerTreeHostImpl.getTree(other);
99     },
100
101     get gpuMemoryUsageInBytes() {
102       var totalBytes = 0;
103       this.iterLayers(function(layer) {
104         if (layer.gpuMemoryUsageInBytes !== undefined)
105           totalBytes += layer.gpuMemoryUsageInBytes;
106       });
107       return totalBytes;
108     },
109
110     iterLayers: function(func, thisArg) {
111       var visitedLayers = {};
112       function visitLayer(layer, depth, isMask, isReplica) {
113         if (visitedLayers[layer.layerId])
114           return;
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);
120         }
121         if (layer.maskLayer)
122           visitLayer(layer.maskLayer, depth + 1, true, false);
123         if (layer.replicaLayer)
124           visitLayer(layer.replicaLayer, depth + 1, false, true);
125       }
126       visitLayer(this.rootLayer, 0, false, false);
127     },
128     findLayerWithId: function(id) {
129       var foundLayer = undefined;
130       function visitLayer(layer) {
131         if (layer.layerId == id)
132           foundLayer = layer;
133       }
134       this.iterLayers(visitLayer);
135       return foundLayer;
136     }
137   };
138
139   ObjectSnapshot.register('cc::LayerTreeImpl', LayerTreeImplSnapshot);
140
141   return {
142     LayerTreeImplSnapshot: LayerTreeImplSnapshot
143   };
144 });
145 </script>