• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CC_DEBUG_OVERDRAW_METRICS_H_
6 #define CC_DEBUG_OVERDRAW_METRICS_H_
7 
8 #include "base/basictypes.h"
9 #include "base/memory/scoped_ptr.h"
10 
11 namespace gfx {
12 class Rect;
13 class Transform;
14 }
15 
16 namespace cc {
17 class LayerTreeHost;
18 class LayerTreeHostImpl;
19 
20 class OverdrawMetrics {
21  public:
Create(bool record_metrics_for_frame)22   static scoped_ptr<OverdrawMetrics> Create(bool record_metrics_for_frame) {
23     return make_scoped_ptr(new OverdrawMetrics(record_metrics_for_frame));
24   }
25 
26   // These methods are used for saving metrics during update/commit.
27 
28   // Record pixels painted by WebKit into the texture updater, but does not mean
29   // the pixels were rasterized in main memory.
30   void DidPaint(gfx::Rect painted_rect);
31   // Records that an invalid tile was culled and did not need to be
32   // painted/uploaded, and did not contribute to other tiles needing to be
33   // painted.
34   void DidCullTilesForUpload(int count);
35   // Records pixels that were uploaded to texture memory.
36   void DidUpload(const gfx::Transform& transform_to_target,
37                  gfx::Rect upload_rect,
38                  gfx::Rect opaque_rect);
39   // Record contents texture(s) behind present using the given number of bytes.
40   void DidUseContentsTextureMemoryBytes(size_t contents_texture_use_bytes);
41   // Record RenderSurfaceImpl texture(s) being present using the given number of
42   // bytes.
43   void DidUseRenderSurfaceTextureMemoryBytes(size_t render_surface_use_bytes);
44 
45   // These methods are used for saving metrics during draw.
46 
47   // Record pixels that were not drawn to screen.
48   void DidCullForDrawing(const gfx::Transform& transform_to_target,
49                          gfx::Rect before_cull_rect,
50                          gfx::Rect after_cull_rect);
51   // Record pixels that were drawn to screen.
52   void DidDraw(const gfx::Transform& transform_to_target,
53                gfx::Rect after_cull_rect,
54                gfx::Rect opaque_rect);
55 
56   void RecordMetrics(const LayerTreeHost* layer_tree_host) const;
57   void RecordMetrics(const LayerTreeHostImpl* layer_tree_host_impl) const;
58 
59   // Accessors for tests.
pixels_drawn_opaque()60   float pixels_drawn_opaque() const { return pixels_drawn_opaque_; }
pixels_drawn_translucent()61   float pixels_drawn_translucent() const { return pixels_drawn_translucent_; }
pixels_culled_for_drawing()62   float pixels_culled_for_drawing() const { return pixels_culled_for_drawing_; }
pixels_painted()63   float pixels_painted() const { return pixels_painted_; }
pixels_uploaded_opaque()64   float pixels_uploaded_opaque() const { return pixels_uploaded_opaque_; }
pixels_uploaded_translucent()65   float pixels_uploaded_translucent() const {
66     return pixels_uploaded_translucent_;
67   }
tiles_culled_for_upload()68   int tiles_culled_for_upload() const { return tiles_culled_for_upload_; }
69 
70  private:
71   enum MetricsType {
72     UpdateAndCommit,
73     DrawingToScreen
74   };
75 
76   explicit OverdrawMetrics(bool record_metrics_for_frame);
77 
78   template <typename LayerTreeHostType>
79   void RecordMetricsInternal(MetricsType metrics_type,
80                              const LayerTreeHostType* layer_tree_host) const;
81 
82   // When false this class is a giant no-op.
83   bool record_metrics_for_frame_;
84 
85   // These values are used for saving metrics during update/commit.
86 
87   // Count of pixels that were painted due to invalidation.
88   float pixels_painted_;
89   // Count of pixels uploaded to textures and known to be opaque.
90   float pixels_uploaded_opaque_;
91   // Count of pixels uploaded to textures and not known to be opaque.
92   float pixels_uploaded_translucent_;
93   // Count of tiles that were invalidated but not uploaded.
94   int tiles_culled_for_upload_;
95   // Count the number of bytes in contents textures.
96   uint64 contents_texture_use_bytes_;
97   // Count the number of bytes in RenderSurfaceImpl textures.
98   uint64 render_surface_texture_use_bytes_;
99 
100   // These values are used for saving metrics during draw.
101 
102   // Count of pixels that are opaque (and thus occlude). Ideally this is no more
103   // than wiewport width x height.
104   float pixels_drawn_opaque_;
105   // Count of pixels that are possibly translucent, and cannot occlude.
106   float pixels_drawn_translucent_;
107   // Count of pixels not drawn as they are occluded by somthing opaque.
108   float pixels_culled_for_drawing_;
109 
110   DISALLOW_COPY_AND_ASSIGN(OverdrawMetrics);
111 };
112 
113 }  // namespace cc
114 
115 #endif  // CC_DEBUG_OVERDRAW_METRICS_H_
116