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)#ifndef UI_COMPOSITOR_COMPOSITOR_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_COMPOSITOR_COMPOSITOR_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/observer_list.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/single_thread_task_runner.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_client.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/trees/layer_tree_host_single_thread_client.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/compositor/compositor_animation_observer.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor_export.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/compositor/compositor_observer.h" 2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/compositor/layer_animator_collection.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace base { 30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class MessageLoopProxy; 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RunLoop; 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContextProvider; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Layer; 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeDebugState; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHost; 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class SharedBitmapManager; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect; 44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Size; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace gpu { 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct Mailbox; 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Compositor; 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CompositorVSyncManager; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Layer; 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Reflector; 57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Texture; 58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct LatencyInfo; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class abstracts the creation of the 3D context for the compositor. It is 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a global object. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT ContextFactory { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ContextFactory() {} 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates an output surface for the given compositor. The factory may keep 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per-compositor data (e.g. a shared context), that needs to be cleaned up 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by calling RemoveCompositor when the compositor gets destroyed. 69558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface( 70a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Compositor* compositor, bool software_fallback) = 0; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Creates a reflector that copies the content of the |mirrored_compositor| 73868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // onto |mirroing_layer|. 74868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual scoped_refptr<Reflector> CreateReflector( 75868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Compositor* mirrored_compositor, 76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Layer* mirroring_layer) = 0; 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Removes the reflector, which stops the mirroring. 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void RemoveReflector(scoped_refptr<Reflector> reflector) = 0; 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Return a reference to a shared offscreen context provider usable from the 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // main thread. 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SharedMainThreadContextProvider() = 0; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroys per-compositor data. 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RemoveCompositor(Compositor* compositor) = 0; 87c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 88c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // When true, the factory uses test contexts that do not do real GL 89c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // operations. 90c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch virtual bool DoesCreateTestContexts() = 0; 91010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 92010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Gets the shared bitmap manager for software mode. 93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual cc::SharedBitmapManager* GetSharedBitmapManager() = 0; 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Gets the compositor message loop, or NULL if not using threaded 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // compositing. 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual base::MessageLoopProxy* GetCompositorMessageLoop() = 0; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class represents a lock on the compositor, that can be used to prevent 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// commits to the compositor tree while we're waiting for an asynchronous 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// event. The typical use case is when waiting for a renderer to produce a frame 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at the right size. The caller keeps a reference on this object, and drops the 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reference once it desires to release the lock. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note however that the lock is cancelled after a short timeout to ensure 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// responsiveness of the UI, so the compositor tree should be kept in a 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "reasonable" state while the lock is held. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Don't instantiate this class directly, use Compositor::GetCompositorLock. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT CompositorLock 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCounted<CompositorLock>, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::SupportsWeakPtr<CompositorLock> { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<CompositorLock>; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class Compositor; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit CompositorLock(Compositor* compositor); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~CompositorLock(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelLock(); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Compositor* compositor_; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CompositorLock); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compositor object to take care of GPU painting. 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A Browser compositor object is responsible for generating the final 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// displayable form of pixels comprising a single widget's contents. It draws an 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// appropriately transformed texture for each transformed view in the widget's 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// view hierarchy. 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT Compositor 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : NON_EXPORTED_BASE(public cc::LayerTreeHostClient), 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NON_EXPORTED_BASE(public cc::LayerTreeHostSingleThreadClient) { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Compositor(gfx::AcceleratedWidget widget, 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::ContextFactory* context_factory, 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> task_runner); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Compositor(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::ContextFactory* context_factory() { return context_factory_; } 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Schedules a redraw of the layer tree associated with this compositor. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ScheduleDraw(); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the root of the layer tree drawn by this Compositor. The root layer 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must have no parent. The compositor's root layer is reset if the root layer 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is destroyed. NULL can be passed to reset the root layer, in which case the 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compositor will stop drawing anything. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The Compositor does not own the root layer. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Layer* root_layer() const { return root_layer_; } 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layer* root_layer() { return root_layer_; } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetRootLayer(Layer* root_layer); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when we need the compositor to preserve the alpha channel in the 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // output for situations when we want to render transparently atop something 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // else, e.g. Aero glass. 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetHostHasTransparentBackground(bool host_has_transparent_background); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The scale factor of the device that this compositor is 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compositing layers on. 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor() const { return device_scale_factor_; } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Draws the scene created by the layer tree and any visual effects. 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Draw(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Where possible, draws are scissored to a damage region calculated from 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changes to layer properties. This bypasses that and indicates that 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the whole frame needs to be drawn. 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ScheduleFullRedraw(); 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Schedule redraw and append damage_rect to the damage region calculated 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // from changes to layer properties. 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ScheduleRedrawRect(const gfx::Rect& damage_rect); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Finishes all outstanding rendering on the GPU. 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void FinishAllRendering(); 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SetLatencyInfo(const LatencyInfo& latency_info); 178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the compositor's device scale factor and size. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetScaleAndSize(float scale, const gfx::Size& size_in_pixel); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the size of the widget that is being drawn to in pixel coordinates. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size() const { return size_; } 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Sets the background color used for areas that aren't covered by 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the |root_layer|. 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetBackgroundColor(SkColor color); 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Set the visibility of the underlying compositor. 1901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetVisible(bool visible); 1911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the widget for this compositor. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::AcceleratedWidget widget() const { return widget_; } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the vsync manager for this compositor. 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<CompositorVSyncManager> vsync_manager() const; 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // Returns the main thread task runner this compositor uses. Users of the 19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) // compositor generally shouldn't use this. 20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> task_runner() const { 20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return task_runner_; 20203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compositor does not own observers. It is the responsibility of the 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // observer to remove itself when it is done observing. 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddObserver(CompositorObserver* observer); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveObserver(CompositorObserver* observer); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasObserver(CompositorObserver* observer); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void AddAnimationObserver(CompositorAnimationObserver* observer); 2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void RemoveAnimationObserver(CompositorAnimationObserver* observer); 2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool HasAnimationObserver(CompositorAnimationObserver* observer); 2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a compositor lock. Returns NULL if it is not possible to lock at 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this time (i.e. we're waiting to complete a previous unlock). 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CompositorLock> GetCompositorLock(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal functions, called back by command-buffer contexts on swap buffer 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // events. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has been posted. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersPosted(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has completed. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersComplete(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has aborted (e.g. lost context). 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersAborted(); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LayerTreeHostClient implementation. 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void WillBeginMainFrame(int frame_id) OVERRIDE {} 2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void DidBeginMainFrame() OVERRIDE {} 23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void BeginMainFrame(const cc::BeginFrameArgs& args) OVERRIDE; 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE; 2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void ApplyViewportDeltas( 2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const gfx::Vector2d& scroll_delta, 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci float page_scale, 2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci float top_controls_delta) OVERRIDE {} 2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void RequestNewOutputSurface(bool fallback) OVERRIDE; 2405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidInitializeOutputSurface() OVERRIDE {} 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void WillCommit() OVERRIDE {} 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE; 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE; 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCompleteSwapBuffers() OVERRIDE; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // cc::LayerTreeHostSingleThreadClient implementation. 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ScheduleComposite() OVERRIDE; 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ScheduleAnimation() OVERRIDE; 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidPostSwapBuffers() OVERRIDE; 250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidAbortSwapBuffers() OVERRIDE; 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_started_frame() { return last_started_frame_; } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_ended_frame() { return last_ended_frame_; } 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsLocked() { return compositor_lock_ != NULL; } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 257c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const cc::LayerTreeDebugState& GetLayerTreeDebugState() const; 258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetLayerTreeDebugState(const cc::LayerTreeDebugState& debug_state); 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) LayerAnimatorCollection* layer_animator_collection() { 26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return &layer_animator_collection_; 26246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 26346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<Compositor>; 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class CompositorLock; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by CompositorLock. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnlockCompositor(); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to release any pending CompositorLock 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelCompositorLock(); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies the compositor that compositing is complete. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyEnd(); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size_; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::ContextFactory* context_factory_; 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The root of the Layer tree drawn by this compositor. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layer* root_layer_; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverList<CompositorObserver> observer_list_; 2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ObserverList<CompositorAnimationObserver> animation_observer_list_; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::AcceleratedWidget widget_; 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<cc::Layer> root_web_layer_; 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::LayerTreeHost> host_; 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_refptr<base::MessageLoopProxy> compositor_thread_loop_; 2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The manager of vsync parameters for this compositor. 2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<CompositorVSyncManager> vsync_manager_; 2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The device scale factor of the monitor that this compositor is compositing 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // layers on. 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor_; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_started_frame_; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_ended_frame_; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool disable_schedule_composite_; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompositorLock* compositor_lock_; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Prevent more than one draw from being scheduled. 3088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool defer_draw_scheduling_; 3098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Used to prevent Draw()s while a composite is in progress. 3118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool waiting_on_compositing_end_; 3128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool draw_on_compositing_end_; 313e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch enum SwapState { SWAP_NONE, SWAP_POSTED, SWAP_COMPLETED }; 314e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SwapState swap_state_; 3158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 31646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) LayerAnimatorCollection layer_animator_collection_; 31746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 3188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::WeakPtrFactory<Compositor> schedule_draw_factory_; 3198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Compositor); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // UI_COMPOSITOR_COMPOSITOR_H_ 326