1 // Copyright 2013 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 #include "cc/debug/rendering_stats_instrumentation.h" 6 7 namespace cc { 8 9 // static 10 scoped_ptr<RenderingStatsInstrumentation> 11 RenderingStatsInstrumentation::Create() { 12 return make_scoped_ptr(new RenderingStatsInstrumentation()); 13 } 14 15 RenderingStatsInstrumentation::RenderingStatsInstrumentation() 16 : record_rendering_stats_(false) { 17 } 18 19 RenderingStatsInstrumentation::~RenderingStatsInstrumentation() {} 20 21 MainThreadRenderingStats 22 RenderingStatsInstrumentation::main_thread_rendering_stats() { 23 base::AutoLock scoped_lock(lock_); 24 return main_thread_rendering_stats_; 25 } 26 27 ImplThreadRenderingStats 28 RenderingStatsInstrumentation::impl_thread_rendering_stats() { 29 base::AutoLock scoped_lock(lock_); 30 return impl_thread_rendering_stats_; 31 } 32 33 RenderingStats RenderingStatsInstrumentation::GetRenderingStats() { 34 base::AutoLock scoped_lock(lock_); 35 RenderingStats rendering_stats; 36 rendering_stats.main_stats = main_thread_rendering_stats_accu_; 37 rendering_stats.main_stats.Add(main_thread_rendering_stats_); 38 rendering_stats.impl_stats = impl_thread_rendering_stats_accu_; 39 rendering_stats.impl_stats.Add(impl_thread_rendering_stats_); 40 return rendering_stats; 41 } 42 43 void RenderingStatsInstrumentation::AccumulateAndClearMainThreadStats() { 44 base::AutoLock scoped_lock(lock_); 45 main_thread_rendering_stats_accu_.Add(main_thread_rendering_stats_); 46 main_thread_rendering_stats_ = MainThreadRenderingStats(); 47 } 48 49 void RenderingStatsInstrumentation::AccumulateAndClearImplThreadStats() { 50 base::AutoLock scoped_lock(lock_); 51 impl_thread_rendering_stats_accu_.Add(impl_thread_rendering_stats_); 52 impl_thread_rendering_stats_ = ImplThreadRenderingStats(); 53 } 54 55 base::TimeTicks RenderingStatsInstrumentation::StartRecording() const { 56 if (record_rendering_stats_) { 57 if (base::TimeTicks::IsThreadNowSupported()) 58 return base::TimeTicks::ThreadNow(); 59 return base::TimeTicks::HighResNow(); 60 } 61 return base::TimeTicks(); 62 } 63 64 base::TimeDelta RenderingStatsInstrumentation::EndRecording( 65 base::TimeTicks start_time) const { 66 if (!start_time.is_null()) { 67 if (base::TimeTicks::IsThreadNowSupported()) 68 return base::TimeTicks::ThreadNow() - start_time; 69 return base::TimeTicks::HighResNow() - start_time; 70 } 71 return base::TimeDelta(); 72 } 73 74 void RenderingStatsInstrumentation::IncrementFrameCount(int64 count, 75 bool main_thread) { 76 if (!record_rendering_stats_) 77 return; 78 79 base::AutoLock scoped_lock(lock_); 80 if (main_thread) 81 main_thread_rendering_stats_.frame_count += count; 82 else 83 impl_thread_rendering_stats_.frame_count += count; 84 } 85 86 void RenderingStatsInstrumentation::AddPaint(base::TimeDelta duration, 87 int64 pixels) { 88 if (!record_rendering_stats_) 89 return; 90 91 base::AutoLock scoped_lock(lock_); 92 main_thread_rendering_stats_.paint_time += duration; 93 main_thread_rendering_stats_.painted_pixel_count += pixels; 94 } 95 96 void RenderingStatsInstrumentation::AddRecord(base::TimeDelta duration, 97 int64 pixels) { 98 if (!record_rendering_stats_) 99 return; 100 101 base::AutoLock scoped_lock(lock_); 102 main_thread_rendering_stats_.record_time += duration; 103 main_thread_rendering_stats_.recorded_pixel_count += pixels; 104 } 105 106 void RenderingStatsInstrumentation::AddRaster(base::TimeDelta duration, 107 int64 pixels) { 108 if (!record_rendering_stats_) 109 return; 110 111 base::AutoLock scoped_lock(lock_); 112 impl_thread_rendering_stats_.rasterize_time += duration; 113 impl_thread_rendering_stats_.rasterized_pixel_count += pixels; 114 } 115 116 void RenderingStatsInstrumentation::AddAnalysis(base::TimeDelta duration, 117 int64 pixels) { 118 if (!record_rendering_stats_) 119 return; 120 121 base::AutoLock scoped_lock(lock_); 122 impl_thread_rendering_stats_.analysis_time += duration; 123 } 124 125 void RenderingStatsInstrumentation::AddVisibleContentArea(int64 area) { 126 if (!record_rendering_stats_) 127 return; 128 129 base::AutoLock scoped_lock(lock_); 130 impl_thread_rendering_stats_.visible_content_area += area; 131 } 132 133 void RenderingStatsInstrumentation::AddApproximatedVisibleContentArea( 134 int64 area) { 135 if (!record_rendering_stats_) 136 return; 137 138 base::AutoLock scoped_lock(lock_); 139 impl_thread_rendering_stats_.approximated_visible_content_area += area; 140 } 141 142 } // namespace cc 143