compositor.h revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
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" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_host_client.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "cc/trees/layer_tree_host_single_thread_client.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor_export.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/compositor/compositor_observer.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace base { 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class MessageLoopProxy; 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RunLoop; 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContextProvider; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Layer; 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeDebugState; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHost; 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class SharedBitmapManager; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect; 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Size; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace gpu { 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct Mailbox; 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Compositor; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CompositorVSyncManager; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Layer; 53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Reflector; 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Texture; 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct LatencyInfo; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class abstracts the creation of the 3D context for the compositor. It is 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a global object. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT ContextFactory { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ContextFactory() {} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the global instance. 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ContextFactory* GetInstance(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the global instance. Caller keeps ownership. 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this function isn't called (for tests), a "default" factory will be 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // created on the first call of GetInstance. 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetInstance(ContextFactory* instance); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates an output surface for the given compositor. The factory may keep 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per-compositor data (e.g. a shared context), that needs to be cleaned up 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by calling RemoveCompositor when the compositor gets destroyed. 74558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface( 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Compositor* compositor, bool software_fallback) = 0; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Creates a reflector that copies the content of the |mirrored_compositor| 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // onto |mirroing_layer|. 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual scoped_refptr<Reflector> CreateReflector( 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Compositor* mirrored_compositor, 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Layer* mirroring_layer) = 0; 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Removes the reflector, which stops the mirroring. 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void RemoveReflector(scoped_refptr<Reflector> reflector) = 0; 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Returns a reference to the offscreen context provider used by the 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // compositor. This provider is bound and used on whichever thread the 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // compositor is rendering from. 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OffscreenCompositorContextProvider() = 0; 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Return a reference to a shared offscreen context provider usable from the 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // main thread. This may be the same as OffscreenCompositorContextProvider() 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // depending on the compositor's threading configuration. This provider will 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // be bound to the main thread. 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SharedMainThreadContextProvider() = 0; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroys per-compositor data. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RemoveCompositor(Compositor* compositor) = 0; 100c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 101c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // When true, the factory uses test contexts that do not do real GL 102c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // operations. 103c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch virtual bool DoesCreateTestContexts() = 0; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Texture provide an abstraction over the external texture that can be passed 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to a layer. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT Texture : public base::RefCounted<Texture> { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Texture(bool flipped, const gfx::Size& size, float device_scale_factor); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool flipped() const { return flipped_; } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size() const { return size_; } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor() const { return device_scale_factor_; } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual unsigned int PrepareTexture() = 0; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Replaces the texture with the texture from the specified mailbox. 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Consume(const gpu::Mailbox& mailbox, 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& new_size) {} 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Moves the texture into the mailbox and returns the mailbox name. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The texture must have been previously consumed from a mailbox. 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual gpu::Mailbox Produce(); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Texture(); 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size size_; // in pixel 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<Texture>; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool flipped_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Texture); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class represents a lock on the compositor, that can be used to prevent 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// commits to the compositor tree while we're waiting for an asynchronous 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// event. The typical use case is when waiting for a renderer to produce a frame 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at the right size. The caller keeps a reference on this object, and drops the 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reference once it desires to release the lock. 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note however that the lock is cancelled after a short timeout to ensure 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// responsiveness of the UI, so the compositor tree should be kept in a 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "reasonable" state while the lock is held. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Don't instantiate this class directly, use Compositor::GetCompositorLock. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT CompositorLock 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCounted<CompositorLock>, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::SupportsWeakPtr<CompositorLock> { 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<CompositorLock>; 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class Compositor; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit CompositorLock(Compositor* compositor); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~CompositorLock(); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelLock(); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Compositor* compositor_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CompositorLock); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compositor object to take care of GPU painting. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A Browser compositor object is responsible for generating the final 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// displayable form of pixels comprising a single widget's contents. It draws an 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// appropriately transformed texture for each transformed view in the widget's 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// view hierarchy. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT Compositor 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : NON_EXPORTED_BASE(public cc::LayerTreeHostClient), 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NON_EXPORTED_BASE(public cc::LayerTreeHostSingleThreadClient) { 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) explicit Compositor(gfx::AcceleratedWidget widget); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Compositor(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void Initialize(); 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static bool WasInitializedWithThread(); 178868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static scoped_refptr<base::MessageLoopProxy> GetCompositorMessageLoop(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Terminate(); 180a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void SetSharedBitmapManager(cc::SharedBitmapManager* manager); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Schedules a redraw of the layer tree associated with this compositor. 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ScheduleDraw(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the root of the layer tree drawn by this Compositor. The root layer 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must have no parent. The compositor's root layer is reset if the root layer 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is destroyed. NULL can be passed to reset the root layer, in which case the 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compositor will stop drawing anything. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The Compositor does not own the root layer. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Layer* root_layer() const { return root_layer_; } 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layer* root_layer() { return root_layer_; } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetRootLayer(Layer* root_layer); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when we need the compositor to preserve the alpha channel in the 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // output for situations when we want to render transparently atop something 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // else, e.g. Aero glass. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetHostHasTransparentBackground(bool host_has_transparent_background); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The scale factor of the device that this compositor is 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compositing layers on. 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor() const { return device_scale_factor_; } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Draws the scene created by the layer tree and any visual effects. 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Draw(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Where possible, draws are scissored to a damage region calculated from 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changes to layer properties. This bypasses that and indicates that 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the whole frame needs to be drawn. 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ScheduleFullRedraw(); 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Schedule redraw and append damage_rect to the damage region calculated 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // from changes to layer properties. 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ScheduleRedrawRect(const gfx::Rect& damage_rect); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SetLatencyInfo(const LatencyInfo& latency_info); 216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the compositor's device scale factor and size. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetScaleAndSize(float scale, const gfx::Size& size_in_pixel); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the size of the widget that is being drawn to in pixel coordinates. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size() const { return size_; } 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Sets the background color used for areas that aren't covered by 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the |root_layer|. 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetBackgroundColor(SkColor color); 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the widget for this compositor. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::AcceleratedWidget widget() const { return widget_; } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the vsync manager for this compositor. 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<CompositorVSyncManager> vsync_manager() const; 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compositor does not own observers. It is the responsibility of the 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // observer to remove itself when it is done observing. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddObserver(CompositorObserver* observer); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveObserver(CompositorObserver* observer); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasObserver(CompositorObserver* observer); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a compositor lock. Returns NULL if it is not possible to lock at 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this time (i.e. we're waiting to complete a previous unlock). 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CompositorLock> GetCompositorLock(); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal functions, called back by command-buffer contexts on swap buffer 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // events. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has been posted. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersPosted(); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has completed. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersComplete(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has aborted (e.g. lost context). 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersAborted(); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LayerTreeHostClient implementation. 256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void WillBeginMainFrame(int frame_id) OVERRIDE {} 2571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void DidBeginMainFrame() OVERRIDE {} 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Animate(base::TimeTicks frame_begin_time) OVERRIDE {} 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE; 2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void ApplyScrollAndScale(const gfx::Vector2d& scroll_delta, 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float page_scale) OVERRIDE {} 262a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) 263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OVERRIDE; 264b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool success) OVERRIDE {} 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void WillCommit() OVERRIDE {} 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE; 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE; 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCompleteSwapBuffers() OVERRIDE; 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OffscreenContextProvider() OVERRIDE; 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // cc::LayerTreeHostSingleThreadClient implementation. 273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ScheduleComposite() OVERRIDE; 274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ScheduleAnimation() OVERRIDE; 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidPostSwapBuffers() OVERRIDE; 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidAbortSwapBuffers() OVERRIDE; 277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_started_frame() { return last_started_frame_; } 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_ended_frame() { return last_ended_frame_; } 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsLocked() { return compositor_lock_ != NULL; } 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const cc::LayerTreeDebugState& GetLayerTreeDebugState() const; 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetLayerTreeDebugState(const cc::LayerTreeDebugState& debug_state); 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<Compositor>; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class CompositorLock; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by CompositorLock. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnlockCompositor(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to release any pending CompositorLock 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelCompositorLock(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies the compositor that compositing is complete. 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyEnd(); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size_; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The root of the Layer tree drawn by this compositor. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layer* root_layer_; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverList<CompositorObserver> observer_list_; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::AcceleratedWidget widget_; 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<cc::Layer> root_web_layer_; 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::LayerTreeHost> host_; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The manager of vsync parameters for this compositor. 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<CompositorVSyncManager> vsync_manager_; 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The device scale factor of the monitor that this compositor is compositing 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // layers on. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor_; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_started_frame_; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_ended_frame_; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 320c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool next_draw_is_resize_; 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool disable_schedule_composite_; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompositorLock* compositor_lock_; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Prevent more than one draw from being scheduled. 3278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool defer_draw_scheduling_; 3288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Used to prevent Draw()s while a composite is in progress. 3308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool waiting_on_compositing_end_; 3318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool draw_on_compositing_end_; 332e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch enum SwapState { SWAP_NONE, SWAP_POSTED, SWAP_COMPLETED }; 333e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch SwapState swap_state_; 3348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::WeakPtrFactory<Compositor> schedule_draw_factory_; 3368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Compositor); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // UI_COMPOSITOR_COMPOSITOR_H_ 343