compositor.h revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PostedSwapQueue; 54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Reflector; 55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Texture; 56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct LatencyInfo; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class abstracts the creation of the 3D context for the compositor. It is 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a global object. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT ContextFactory { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ContextFactory() {} 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the global instance. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ContextFactory* GetInstance(); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the global instance. Caller keeps ownership. 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this function isn't called (for tests), a "default" factory will be 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // created on the first call of GetInstance. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetInstance(ContextFactory* instance); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates an output surface for the given compositor. The factory may keep 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per-compositor data (e.g. a shared context), that needs to be cleaned up 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by calling RemoveCompositor when the compositor gets destroyed. 75558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface( 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Compositor* compositor, bool software_fallback) = 0; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Creates a reflector that copies the content of the |mirrored_compositor| 79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // onto |mirroing_layer|. 80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual scoped_refptr<Reflector> CreateReflector( 81868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Compositor* mirrored_compositor, 82868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Layer* mirroring_layer) = 0; 83868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Removes the reflector, which stops the mirroring. 84868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void RemoveReflector(scoped_refptr<Reflector> reflector) = 0; 85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Returns a reference to the offscreen context provider used by the 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // compositor. This provider is bound and used on whichever thread the 884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // compositor is rendering from. 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OffscreenCompositorContextProvider() = 0; 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Return a reference to a shared offscreen context provider usable from the 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // main thread. This may be the same as OffscreenCompositorContextProvider() 944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // depending on the compositor's threading configuration. This provider will 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // be bound to the main thread. 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SharedMainThreadContextProvider() = 0; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroys per-compositor data. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RemoveCompositor(Compositor* compositor) = 0; 101c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 102c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // When true, the factory uses test contexts that do not do real GL 103c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // operations. 104c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch virtual bool DoesCreateTestContexts() = 0; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Texture provide an abstraction over the external texture that can be passed 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to a layer. 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT Texture : public base::RefCounted<Texture> { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Texture(bool flipped, const gfx::Size& size, float device_scale_factor); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool flipped() const { return flipped_; } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size() const { return size_; } 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor() const { return device_scale_factor_; } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual unsigned int PrepareTexture() = 0; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Replaces the texture with the texture from the specified mailbox. 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Consume(const gpu::Mailbox& mailbox, 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& new_size) {} 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Moves the texture into the mailbox and returns the mailbox name. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The texture must have been previously consumed from a mailbox. 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual gpu::Mailbox Produce(); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Texture(); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size size_; // in pixel 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<Texture>; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool flipped_; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Texture); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class represents a lock on the compositor, that can be used to prevent 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// commits to the compositor tree while we're waiting for an asynchronous 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// event. The typical use case is when waiting for a renderer to produce a frame 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at the right size. The caller keeps a reference on this object, and drops the 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reference once it desires to release the lock. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note however that the lock is cancelled after a short timeout to ensure 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// responsiveness of the UI, so the compositor tree should be kept in a 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "reasonable" state while the lock is held. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Don't instantiate this class directly, use Compositor::GetCompositorLock. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT CompositorLock 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCounted<CompositorLock>, 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::SupportsWeakPtr<CompositorLock> { 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<CompositorLock>; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class Compositor; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit CompositorLock(Compositor* compositor); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~CompositorLock(); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelLock(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Compositor* compositor_; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CompositorLock); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compositor object to take care of GPU painting. 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A Browser compositor object is responsible for generating the final 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// displayable form of pixels comprising a single widget's contents. It draws an 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// appropriately transformed texture for each transformed view in the widget's 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// view hierarchy. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT Compositor 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : NON_EXPORTED_BASE(public cc::LayerTreeHostClient), 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NON_EXPORTED_BASE(public cc::LayerTreeHostSingleThreadClient) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) explicit Compositor(gfx::AcceleratedWidget widget); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Compositor(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void Initialize(); 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static bool WasInitializedWithThread(); 179868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static scoped_refptr<base::MessageLoopProxy> GetCompositorMessageLoop(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Terminate(); 181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static void SetSharedBitmapManager(cc::SharedBitmapManager* manager); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Schedules a redraw of the layer tree associated with this compositor. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ScheduleDraw(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the root of the layer tree drawn by this Compositor. The root layer 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must have no parent. The compositor's root layer is reset if the root layer 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is destroyed. NULL can be passed to reset the root layer, in which case the 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compositor will stop drawing anything. 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The Compositor does not own the root layer. 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Layer* root_layer() const { return root_layer_; } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layer* root_layer() { return root_layer_; } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetRootLayer(Layer* root_layer); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when we need the compositor to preserve the alpha channel in the 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // output for situations when we want to render transparently atop something 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // else, e.g. Aero glass. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetHostHasTransparentBackground(bool host_has_transparent_background); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The scale factor of the device that this compositor is 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compositing layers on. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor() const { return device_scale_factor_; } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Draws the scene created by the layer tree and any visual effects. 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Draw(); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Where possible, draws are scissored to a damage region calculated from 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changes to layer properties. This bypasses that and indicates that 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the whole frame needs to be drawn. 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ScheduleFullRedraw(); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Schedule redraw and append damage_rect to the damage region calculated 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // from changes to layer properties. 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ScheduleRedrawRect(const gfx::Rect& damage_rect); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void SetLatencyInfo(const LatencyInfo& latency_info); 217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the compositor's device scale factor and size. 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetScaleAndSize(float scale, const gfx::Size& size_in_pixel); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the size of the widget that is being drawn to in pixel coordinates. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size() const { return size_; } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Sets the background color used for areas that aren't covered by 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the |root_layer|. 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetBackgroundColor(SkColor color); 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the widget for this compositor. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::AcceleratedWidget widget() const { return widget_; } 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the vsync manager for this compositor. 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<CompositorVSyncManager> vsync_manager() const; 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compositor does not own observers. It is the responsibility of the 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // observer to remove itself when it is done observing. 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddObserver(CompositorObserver* observer); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveObserver(CompositorObserver* observer); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasObserver(CompositorObserver* observer); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a compositor lock. Returns NULL if it is not possible to lock at 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this time (i.e. we're waiting to complete a previous unlock). 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CompositorLock> GetCompositorLock(); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal functions, called back by command-buffer contexts on swap buffer 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // events. 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has been posted. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersPosted(); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has completed. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersComplete(); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has aborted (e.g. lost context). 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersAborted(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LayerTreeHostClient implementation. 257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void WillBeginMainFrame(int frame_id) OVERRIDE {} 2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void DidBeginMainFrame() OVERRIDE {} 2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Animate(base::TimeTicks frame_begin_time) OVERRIDE {} 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE; 2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void ApplyScrollAndScale(const gfx::Vector2d& scroll_delta, 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float page_scale) OVERRIDE {} 263a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) 264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OVERRIDE; 265b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool success) OVERRIDE {} 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void WillCommit() OVERRIDE {} 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE; 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE; 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCompleteSwapBuffers() OVERRIDE; 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OffscreenContextProvider() OVERRIDE; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // cc::LayerTreeHostSingleThreadClient implementation. 274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ScheduleComposite() OVERRIDE; 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ScheduleAnimation() OVERRIDE; 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidPostSwapBuffers() OVERRIDE; 277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidAbortSwapBuffers() OVERRIDE; 278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_started_frame() { return last_started_frame_; } 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_ended_frame() { return last_ended_frame_; } 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsLocked() { return compositor_lock_ != NULL; } 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const cc::LayerTreeDebugState& GetLayerTreeDebugState() const; 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetLayerTreeDebugState(const cc::LayerTreeDebugState& debug_state); 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<Compositor>; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class CompositorLock; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by CompositorLock. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnlockCompositor(); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to release any pending CompositorLock 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelCompositorLock(); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies the compositor that compositing is complete. 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyEnd(); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size_; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The root of the Layer tree drawn by this compositor. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layer* root_layer_; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverList<CompositorObserver> observer_list_; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::AcceleratedWidget widget_; 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<cc::Layer> root_web_layer_; 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::LayerTreeHost> host_; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The manager of vsync parameters for this compositor. 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<CompositorVSyncManager> vsync_manager_; 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to verify that we have at most one draw swap in flight. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PostedSwapQueue> posted_swaps_; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The device scale factor of the monitor that this compositor is compositing 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // layers on. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor_; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_started_frame_; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_ended_frame_; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 324c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool next_draw_is_resize_; 325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool disable_schedule_composite_; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompositorLock* compositor_lock_; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Prevent more than one draw from being scheduled. 3318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool defer_draw_scheduling_; 3328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Used to prevent Draw()s while a composite is in progress. 3348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool waiting_on_compositing_end_; 3358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool draw_on_compositing_end_; 3368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::WeakPtrFactory<Compositor> schedule_draw_factory_; 3388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Compositor); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // UI_COMPOSITOR_COMPOSITOR_H_ 345