Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(23)

Side by Side Diff: ui/compositor/compositor.cc

Issue 423773002: Unified BeginFrame scheduling (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/compositor/compositor.h" 5 #include "ui/compositor/compositor.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <deque> 8 #include <deque>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/command_line.h" 11 #include "base/command_line.h"
12 #include "base/debug/trace_event.h" 12 #include "base/debug/trace_event.h"
13 #include "base/message_loop/message_loop.h" 13 #include "base/message_loop/message_loop.h"
14 #include "base/metrics/histogram.h" 14 #include "base/metrics/histogram.h"
15 #include "base/strings/string_util.h" 15 #include "base/strings/string_util.h"
16 #include "base/sys_info.h" 16 #include "base/sys_info.h"
17 #include "cc/base/latency_info_swap_promise.h" 17 #include "cc/base/latency_info_swap_promise.h"
18 #include "cc/base/switches.h" 18 #include "cc/base/switches.h"
19 #include "cc/input/input_handler.h" 19 #include "cc/input/input_handler.h"
20 #include "cc/layers/layer.h" 20 #include "cc/layers/layer.h"
21 #include "cc/output/context_provider.h" 21 #include "cc/output/context_provider.h"
22 #include "cc/scheduler/begin_frame_manager.h"
22 #include "cc/trees/layer_tree_host.h" 23 #include "cc/trees/layer_tree_host.h"
23 #include "third_party/skia/include/core/SkBitmap.h" 24 #include "third_party/skia/include/core/SkBitmap.h"
24 #include "ui/compositor/compositor_observer.h" 25 #include "ui/compositor/compositor_observer.h"
25 #include "ui/compositor/compositor_switches.h" 26 #include "ui/compositor/compositor_switches.h"
26 #include "ui/compositor/compositor_vsync_manager.h"
27 #include "ui/compositor/dip_util.h" 27 #include "ui/compositor/dip_util.h"
28 #include "ui/compositor/layer.h" 28 #include "ui/compositor/layer.h"
29 #include "ui/compositor/layer_animator_collection.h" 29 #include "ui/compositor/layer_animator_collection.h"
30 #include "ui/gfx/frame_time.h" 30 #include "ui/gfx/frame_time.h"
31 #include "ui/gl/gl_context.h" 31 #include "ui/gl/gl_context.h"
32 #include "ui/gl/gl_switches.h" 32 #include "ui/gl/gl_switches.h"
33 33
34 namespace { 34 namespace {
35 35
36 const double kDefaultRefreshRate = 60.0; 36 const double kDefaultRefreshRate = 60.0;
(...skipping 25 matching lines...) Expand all
62 } 62 }
63 63
64 Compositor::Compositor(gfx::AcceleratedWidget widget, 64 Compositor::Compositor(gfx::AcceleratedWidget widget,
65 ui::ContextFactory* context_factory, 65 ui::ContextFactory* context_factory,
66 scoped_refptr<base::SingleThreadTaskRunner> task_runner) 66 scoped_refptr<base::SingleThreadTaskRunner> task_runner)
67 : context_factory_(context_factory), 67 : context_factory_(context_factory),
68 root_layer_(NULL), 68 root_layer_(NULL),
69 widget_(widget), 69 widget_(widget),
70 compositor_thread_loop_(context_factory->GetCompositorMessageLoop()), 70 compositor_thread_loop_(context_factory->GetCompositorMessageLoop()),
71 task_runner_(task_runner), 71 task_runner_(task_runner),
72 vsync_manager_(new CompositorVSyncManager()), 72 begin_frame_manager_(new cc::BeginFrameManager),
73 device_scale_factor_(0.0f), 73 device_scale_factor_(0.0f),
74 disable_schedule_composite_(false), 74 disable_schedule_composite_(false),
75 compositor_lock_(NULL), 75 compositor_lock_(NULL),
76 layer_animator_collection_(this) { 76 layer_animator_collection_(this) {
77 root_web_layer_ = cc::Layer::Create(); 77 root_web_layer_ = cc::Layer::Create();
78 78
79 CommandLine* command_line = CommandLine::ForCurrentProcess(); 79 CommandLine* command_line = CommandLine::ForCurrentProcess();
80 80
81 cc::LayerTreeSettings settings; 81 cc::LayerTreeSettings settings;
82 settings.refresh_rate = 82 settings.refresh_rate =
83 context_factory_->DoesCreateTestContexts() 83 context_factory_->DoesCreateTestContexts()
84 ? kTestRefreshRate 84 ? kTestRefreshRate
85 : kDefaultRefreshRate; 85 : kDefaultRefreshRate;
86 settings.main_frame_before_draw_enabled = false; 86 settings.main_frame_before_draw_enabled = false;
87 settings.main_frame_before_activation_enabled = false; 87 settings.main_frame_before_activation_enabled = false;
88 settings.throttle_frame_production = 88 settings.throttle_frame_production =
89 !command_line->HasSwitch(switches::kDisableGpuVsync); 89 !command_line->HasSwitch(switches::kDisableGpuVsync);
90 #if !defined(OS_MACOSX) 90 #if !defined(OS_MACOSX)
91 settings.partial_swap_enabled = 91 settings.partial_swap_enabled =
92 !command_line->HasSwitch(cc::switches::kUIDisablePartialSwap); 92 !command_line->HasSwitch(cc::switches::kUIDisablePartialSwap);
93 settings.begin_frame_publisher =
94 command_line->HasSwitch(cc::switches::kEnableBeginFrameScheduling);
93 #endif 95 #endif
94 #if defined(OS_CHROMEOS) 96 #if defined(OS_CHROMEOS)
95 settings.per_tile_painting_enabled = true; 97 settings.per_tile_painting_enabled = true;
96 #endif 98 #endif
97 99
98 // These flags should be mirrored by renderer versions in content/renderer/. 100 // These flags should be mirrored by renderer versions in content/renderer/.
99 settings.initial_debug_state.show_debug_borders = 101 settings.initial_debug_state.show_debug_borders =
100 command_line->HasSwitch(cc::switches::kUIShowCompositedLayerBorders); 102 command_line->HasSwitch(cc::switches::kUIShowCompositedLayerBorders);
101 settings.initial_debug_state.show_fps_counter = 103 settings.initial_debug_state.show_fps_counter =
102 command_line->HasSwitch(cc::switches::kUIShowFPSCounter); 104 command_line->HasSwitch(cc::switches::kUIShowFPSCounter);
(...skipping 15 matching lines...) Expand all
118 command_line->HasSwitch(cc::switches::kUIShowNonOccludingRects); 120 command_line->HasSwitch(cc::switches::kUIShowNonOccludingRects);
119 121
120 settings.initial_debug_state.SetRecordRenderingStats( 122 settings.initial_debug_state.SetRecordRenderingStats(
121 command_line->HasSwitch(cc::switches::kEnableGpuBenchmarking)); 123 command_line->HasSwitch(cc::switches::kEnableGpuBenchmarking));
122 124
123 settings.impl_side_painting = IsUIImplSidePaintingEnabled(); 125 settings.impl_side_painting = IsUIImplSidePaintingEnabled();
124 settings.use_zero_copy = IsUIZeroCopyEnabled(); 126 settings.use_zero_copy = IsUIZeroCopyEnabled();
125 127
126 base::TimeTicks before_create = base::TimeTicks::Now(); 128 base::TimeTicks before_create = base::TimeTicks::Now();
127 if (compositor_thread_loop_) { 129 if (compositor_thread_loop_) {
130 // --enable-begin-frame-scheduling is not used with threaded compositing.
131 DCHECK(!settings.begin_frame_publisher);
128 host_ = cc::LayerTreeHost::CreateThreaded( 132 host_ = cc::LayerTreeHost::CreateThreaded(
129 this, 133 this,
130 context_factory_->GetSharedBitmapManager(), 134 context_factory_->GetSharedBitmapManager(),
131 settings, 135 settings,
132 task_runner_, 136 task_runner_,
133 compositor_thread_loop_); 137 compositor_thread_loop_);
134 } else { 138 } else {
135 host_ = cc::LayerTreeHost::CreateSingleThreaded( 139 host_ = cc::LayerTreeHost::CreateSingleThreaded(
136 this, 140 this,
137 this, 141 this,
138 context_factory_->GetSharedBitmapManager(), 142 context_factory_->GetSharedBitmapManager(),
139 settings, 143 settings,
140 task_runner_); 144 task_runner_,
145 begin_frame_manager_.get());
141 } 146 }
142 UMA_HISTOGRAM_TIMES("GPU.CreateBrowserCompositor", 147 UMA_HISTOGRAM_TIMES("GPU.CreateBrowserCompositor",
143 base::TimeTicks::Now() - before_create); 148 base::TimeTicks::Now() - before_create);
144 host_->SetRootLayer(root_web_layer_); 149 host_->SetRootLayer(root_web_layer_);
145 host_->SetLayerTreeHostClientReady(); 150 host_->SetLayerTreeHostClientReady();
146 } 151 }
147 152
148 Compositor::~Compositor() { 153 Compositor::~Compositor() {
149 TRACE_EVENT0("shutdown", "Compositor::destructor"); 154 TRACE_EVENT0("shutdown", "Compositor::destructor");
150 155
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 if (root_layer_) 226 if (root_layer_)
222 root_layer_->OnDeviceScaleFactorChanged(scale); 227 root_layer_->OnDeviceScaleFactorChanged(scale);
223 } 228 }
224 } 229 }
225 230
226 void Compositor::SetBackgroundColor(SkColor color) { 231 void Compositor::SetBackgroundColor(SkColor color) {
227 host_->set_background_color(color); 232 host_->set_background_color(color);
228 ScheduleDraw(); 233 ScheduleDraw();
229 } 234 }
230 235
231 scoped_refptr<CompositorVSyncManager> Compositor::vsync_manager() const { 236 void Compositor::SetAuthoritativeVSyncInterval(
232 return vsync_manager_; 237 base::TimeDelta interval) const {
238 begin_frame_manager_->SetAuthoritativeVSyncInterval(interval);
233 } 239 }
234 240
235 void Compositor::AddObserver(CompositorObserver* observer) { 241 void Compositor::AddObserver(CompositorObserver* observer) {
236 observer_list_.AddObserver(observer); 242 observer_list_.AddObserver(observer);
237 } 243 }
238 244
239 void Compositor::RemoveObserver(CompositorObserver* observer) { 245 void Compositor::RemoveObserver(CompositorObserver* observer) {
240 observer_list_.RemoveObserver(observer); 246 observer_list_.RemoveObserver(observer);
241 } 247 }
242 248
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 observer_list_, 350 observer_list_,
345 OnCompositingLockStateChanged(this)); 351 OnCompositingLockStateChanged(this));
346 } 352 }
347 353
348 void Compositor::CancelCompositorLock() { 354 void Compositor::CancelCompositorLock() {
349 if (compositor_lock_) 355 if (compositor_lock_)
350 compositor_lock_->CancelLock(); 356 compositor_lock_->CancelLock();
351 } 357 }
352 358
353 } // namespace ui 359 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698