compositor.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/debug/trace_event.h"
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h"
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/metrics/histogram.h"
155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h"
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/base/latency_info_swap_promise.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/switches.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/input/input_handler.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/output/context_provider.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor_observer.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor_switches.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/compositor/compositor_vsync_manager.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/dip_util.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/layer.h"
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/compositor/layer_animator_collection.h"
301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ui/gfx/frame_time.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_context.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_switches.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const double kDefaultRefreshRate = 60.0;
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const double kTestRefreshRate = 200.0;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kCompositorLockTimeoutMs = 67;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CompositorLock::CompositorLock(Compositor* compositor)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : compositor_(compositor) {
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  compositor_->task_runner_->PostDelayedTask(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      FROM_HERE,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&CompositorLock::CancelLock, AsWeakPtr()),
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromMilliseconds(kCompositorLockTimeoutMs));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CompositorLock::~CompositorLock() {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CancelLock();
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CompositorLock::CancelLock() {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!compositor_)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  compositor_->UnlockCompositor();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  compositor_ = NULL;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)namespace {}  // namespace
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)Compositor::Compositor(gfx::AcceleratedWidget widget,
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       ui::ContextFactory* context_factory,
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                       scoped_refptr<base::SingleThreadTaskRunner> task_runner)
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : context_factory_(context_factory),
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      root_layer_(NULL),
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      widget_(widget),
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      compositor_thread_loop_(context_factory->GetCompositorMessageLoop()),
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      task_runner_(task_runner),
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      vsync_manager_(new CompositorVSyncManager()),
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      device_scale_factor_(0.0f),
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_started_frame_(0),
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      last_ended_frame_(0),
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      disable_schedule_composite_(false),
838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      compositor_lock_(NULL),
848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      defer_draw_scheduling_(false),
858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      waiting_on_compositing_end_(false),
868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      draw_on_compositing_end_(false),
87e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      swap_state_(SWAP_NONE),
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      layer_animator_collection_(this),
890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      schedule_draw_factory_(this) {
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_web_layer_ = cc::Layer::Create();
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CommandLine* command_line = CommandLine::ForCurrentProcess();
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cc::LayerTreeSettings settings;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.refresh_rate =
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      context_factory_->DoesCreateTestContexts()
97c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      ? kTestRefreshRate
98c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch      : kDefaultRefreshRate;
99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  settings.main_frame_before_draw_enabled = false;
100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  settings.main_frame_before_activation_enabled = false;
101e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  settings.throttle_frame_production =
102e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      !command_line->HasSwitch(switches::kDisableGpuVsync);
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if !defined(OS_MACOSX)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.partial_swap_enabled =
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      !command_line->HasSwitch(cc::switches::kUIDisablePartialSwap);
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_CHROMEOS)
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  settings.per_tile_painting_enabled = true;
109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // These flags should be mirrored by renderer versions in content/renderer/.
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_debug_borders =
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      command_line->HasSwitch(cc::switches::kUIShowCompositedLayerBorders);
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_fps_counter =
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      command_line->HasSwitch(cc::switches::kUIShowFPSCounter);
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  settings.initial_debug_state.show_layer_animation_bounds_rects =
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      command_line->HasSwitch(cc::switches::kUIShowLayerAnimationBounds);
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_paint_rects =
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      command_line->HasSwitch(switches::kUIShowPaintRects);
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_property_changed_rects =
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      command_line->HasSwitch(cc::switches::kUIShowPropertyChangedRects);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_surface_damage_rects =
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      command_line->HasSwitch(cc::switches::kUIShowSurfaceDamageRects);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_screen_space_rects =
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      command_line->HasSwitch(cc::switches::kUIShowScreenSpaceRects);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_replica_screen_space_rects =
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      command_line->HasSwitch(cc::switches::kUIShowReplicaScreenSpaceRects);
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_occluding_rects =
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      command_line->HasSwitch(cc::switches::kUIShowOccludingRects);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  settings.initial_debug_state.show_non_occluding_rects =
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      command_line->HasSwitch(cc::switches::kUIShowNonOccludingRects);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  settings.initial_debug_state.SetRecordRenderingStats(
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      command_line->HasSwitch(cc::switches::kEnableGpuBenchmarking));
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  settings.impl_side_painting = IsUIImplSidePaintingEnabled();
1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  settings.use_zero_copy = IsUIZeroCopyEnabled();
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::TimeTicks before_create = base::TimeTicks::Now();
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (compositor_thread_loop_) {
141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    host_ = cc::LayerTreeHost::CreateThreaded(
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        this,
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        context_factory_->GetSharedBitmapManager(),
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        settings,
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        task_runner_,
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        compositor_thread_loop_);
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    host_ = cc::LayerTreeHost::CreateSingleThreaded(
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        this,
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        this,
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        context_factory_->GetSharedBitmapManager(),
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        settings,
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        task_runner_);
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
155a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  UMA_HISTOGRAM_TIMES("GPU.CreateBrowserCompositor",
156a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                      base::TimeTicks::Now() - before_create);
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetRootLayer(root_web_layer_);
158b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  host_->SetLayerTreeHostClientReady();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Compositor::~Compositor() {
16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  TRACE_EVENT0("shutdown", "Compositor::destructor");
16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CancelCompositorLock();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!compositor_lock_);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (root_layer_)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root_layer_->SetCompositor(NULL);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stop all outstanding draws before telling the ContextFactory to tear
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // down any contexts that the |host_| may rely upon.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host_.reset();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  context_factory_->RemoveCompositor(this);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Compositor::ScheduleDraw() {
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (compositor_thread_loop_) {
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    host_->SetNeedsCommit();
1808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  } else if (!defer_draw_scheduling_) {
1818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    defer_draw_scheduling_ = true;
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    task_runner_->PostTask(
1838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        FROM_HERE,
1848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)        base::Bind(&Compositor::Draw, schedule_draw_factory_.GetWeakPtr()));
1858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Compositor::SetRootLayer(Layer* root_layer) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (root_layer_ == root_layer)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (root_layer_)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root_layer_->SetCompositor(NULL);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_layer_ = root_layer;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (root_layer_ && !root_layer_->GetCompositor())
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root_layer_->SetCompositor(this);
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_web_layer_->RemoveAllChildren();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (root_layer_)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_web_layer_->AddChild(root_layer_->cc_layer());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Compositor::SetHostHasTransparentBackground(
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool host_has_transparent_background) {
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->set_has_transparent_background(host_has_transparent_background);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Compositor::Draw() {
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(!compositor_thread_loop_);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  defer_draw_scheduling_ = false;
2108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (waiting_on_compositing_end_) {
2118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    draw_on_compositing_end_ = true;
2128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return;
2138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!root_layer_)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TRACE_EVENT_ASYNC_BEGIN0("ui", "Compositor::Draw", last_started_frame_ + 1);
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
219e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_NE(swap_state_, SWAP_POSTED);
220e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  swap_state_ = SWAP_NONE;
221e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  waiting_on_compositing_end_ = true;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_started_frame_++;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsLocked()) {
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TODO(nduca): Temporary while compositor calls
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // compositeImmediately() directly.
22746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    base::TimeTicks now = gfx::FrameTime::Now();
22846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    Animate(now);
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Layout();
23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    host_->Composite(now);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
232e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  if (swap_state_ == SWAP_NONE)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NotifyEnd();
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Compositor::ScheduleFullRedraw() {
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  host_->SetNeedsRedraw();
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Compositor::ScheduleRedrawRect(const gfx::Rect& damage_rect) {
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host_->SetNeedsRedrawRect(damage_rect);
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Compositor::FinishAllRendering() {
245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  host_->FinishAllRendering();
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
248868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)void Compositor::SetLatencyInfo(const ui::LatencyInfo& latency_info) {
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<cc::SwapPromise> swap_promise(
250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      new cc::LatencyInfoSwapPromise(latency_info));
251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  host_->QueueSwapPromise(swap_promise.Pass());
252868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
253868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Compositor::SetScaleAndSize(float scale, const gfx::Size& size_in_pixel) {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GT(scale, 0);
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!size_in_pixel.IsEmpty()) {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    size_ = size_in_pixel;
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    host_->SetViewportSize(size_in_pixel);
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    root_web_layer_->SetBounds(size_in_pixel);
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (device_scale_factor_ != scale) {
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    device_scale_factor_ = scale;
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    host_->SetDeviceScaleFactor(scale);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (root_layer_)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      root_layer_->OnDeviceScaleFactorChanged(scale);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Compositor::SetBackgroundColor(SkColor color) {
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host_->set_background_color(color);
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScheduleDraw();
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_refptr<CompositorVSyncManager> Compositor::vsync_manager() const {
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return vsync_manager_;
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Compositor::AddObserver(CompositorObserver* observer) {
2796e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(OS_MACOSX)
2806e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Debugging instrumentation for crbug.com/401630.
2816e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // TODO(ccameron): remove this.
2826e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  CHECK(observer);
2836e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!observer_list_.HasObserver(observer))
2846e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    observer->observing_count_ += 1;
2856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
2866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_list_.AddObserver(observer);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Compositor::RemoveObserver(CompositorObserver* observer) {
2916e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#if defined(OS_MACOSX)
2926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // Debugging instrumentation for crbug.com/401630.
2936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  // TODO(ccameron): remove this.
2946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (observer_list_.HasObserver(observer))
2956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    observer->observing_count_ -= 1;
2966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#endif
2976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_list_.RemoveObserver(observer);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Compositor::HasObserver(CompositorObserver* observer) {
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return observer_list_.HasObserver(observer);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void Compositor::AddAnimationObserver(CompositorAnimationObserver* observer) {
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  animation_observer_list_.AddObserver(observer);
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  host_->SetNeedsAnimate();
3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void Compositor::RemoveAnimationObserver(
3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    CompositorAnimationObserver* observer) {
3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  animation_observer_list_.RemoveObserver(observer);
3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool Compositor::HasAnimationObserver(CompositorAnimationObserver* observer) {
3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return animation_observer_list_.HasObserver(observer);
3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
31946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void Compositor::Animate(base::TimeTicks frame_begin_time) {
3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FOR_EACH_OBSERVER(CompositorAnimationObserver,
3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    animation_observer_list_,
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    OnAnimationStep(frame_begin_time));
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (animation_observer_list_.might_have_observers())
32446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    host_->SetNeedsAnimate();
32546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
32646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Compositor::Layout() {
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We're sending damage that will be addressed during this composite
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cycle, so we don't need to schedule another composite to address it.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disable_schedule_composite_ = true;
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (root_layer_)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root_layer_->SendDamagedRects();
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  disable_schedule_composite_ = false;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
336a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)scoped_ptr<cc::OutputSurface> Compositor::CreateOutputSurface(bool fallback) {
337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return context_factory_->CreateOutputSurface(this, fallback);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Compositor::DidCommit() {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!IsLocked());
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(CompositorObserver,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    observer_list_,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    OnCompositingDidCommit(this));
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Compositor::DidCommitAndDrawFrame() {
3481e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  base::TimeTicks start_time = gfx::FrameTime::Now();
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(CompositorObserver,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    observer_list_,
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    OnCompositingStarted(this, start_time));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Compositor::DidCompleteSwapBuffers() {
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (compositor_thread_loop_) {
356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    NotifyEnd();
357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  } else {
358e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    DCHECK_EQ(swap_state_, SWAP_POSTED);
359e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    NotifyEnd();
360e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    swap_state_ = SWAP_COMPLETED;
361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Compositor::ScheduleComposite() {
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!disable_schedule_composite_)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScheduleDraw();
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void Compositor::ScheduleAnimation() {
370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ScheduleComposite();
371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void Compositor::DidPostSwapBuffers() {
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(!compositor_thread_loop_);
375e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_EQ(swap_state_, SWAP_NONE);
376e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  swap_state_ = SWAP_POSTED;
377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void Compositor::DidAbortSwapBuffers() {
380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!compositor_thread_loop_) {
381e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch    if (swap_state_ == SWAP_POSTED) {
382e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      NotifyEnd();
383e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch      swap_state_ = SWAP_COMPLETED;
384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  FOR_EACH_OBSERVER(CompositorObserver,
388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    observer_list_,
389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    OnCompositingAborted(this));
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const cc::LayerTreeDebugState& Compositor::GetLayerTreeDebugState() const {
393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return host_->debug_state();
394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void Compositor::SetLayerTreeDebugState(
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const cc::LayerTreeDebugState& debug_state) {
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  host_->SetDebugState(debug_state);
399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_refptr<CompositorLock> Compositor::GetCompositorLock() {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!compositor_lock_) {
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    compositor_lock_ = new CompositorLock(this);
404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if (compositor_thread_loop_)
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      host_->SetDeferCommits(true);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FOR_EACH_OBSERVER(CompositorObserver,
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      observer_list_,
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      OnCompositingLockStateChanged(this));
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return compositor_lock_;
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Compositor::UnlockCompositor() {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(compositor_lock_);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  compositor_lock_ = NULL;
416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (compositor_thread_loop_)
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    host_->SetDeferCommits(false);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FOR_EACH_OBSERVER(CompositorObserver,
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    observer_list_,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    OnCompositingLockStateChanged(this));
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Compositor::CancelCompositorLock() {
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (compositor_lock_)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    compositor_lock_->CancelLock();
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Compositor::NotifyEnd() {
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_ended_frame_++;
4308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  TRACE_EVENT_ASYNC_END0("ui", "Compositor::Draw", last_ended_frame_);
4318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  waiting_on_compositing_end_ = false;
4328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  if (draw_on_compositing_end_) {
4338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    draw_on_compositing_end_ = false;
4348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // Call ScheduleDraw() instead of Draw() in order to allow other
4368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // CompositorObservers to be notified before starting another
4378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    // draw cycle.
4388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    ScheduleDraw();
4398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
4406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  FOR_EACH_OBSERVER(
4416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      CompositorObserver, observer_list_, OnCompositingEnded(this));
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
445