compositor.h revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/compositor/compositor_export.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/compositor/compositor_observer.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/transform.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/vector2d.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gl/gl_share_group.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace base { 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class MessageLoopProxy; 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class RunLoop; 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContextProvider; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Layer; 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class LayerTreeDebugState; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHost; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLContext; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLSurface; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLShareGroup; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Point; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect; 45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Size; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace WebKit { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebGraphicsContext3D; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace webkit { 533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace gpu { 543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class ContextProviderInProcess; 553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class WebGraphicsContext3DInProcessCommandBufferImpl; 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Compositor; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CompositorObserver; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContextProviderFromContextFactory; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Layer; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PostedSwapQueue; 66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Reflector; 67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class Texture; 68868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)struct LatencyInfo; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class abstracts the creation of the 3D context for the compositor. It is 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a global object. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT ContextFactory { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ContextFactory() {} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Gets the global instance. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ContextFactory* GetInstance(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the global instance. Caller keeps ownership. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this function isn't called (for tests), a "default" factory will be 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // created on the first call of GetInstance. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void SetInstance(ContextFactory* instance); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates an output surface for the given compositor. The factory may keep 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // per-compositor data (e.g. a shared context), that needs to be cleaned up 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by calling RemoveCompositor when the compositor gets destroyed. 87558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface( 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Compositor* compositor) = 0; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 90868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Creates a reflector that copies the content of the |mirrored_compositor| 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // onto |mirroing_layer|. 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual scoped_refptr<Reflector> CreateReflector( 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Compositor* mirrored_compositor, 94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) Layer* mirroring_layer) = 0; 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Removes the reflector, which stops the mirroring. 96868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual void RemoveReflector(scoped_refptr<Reflector> reflector) = 0; 97868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Returns a reference to the offscreen context provider used by the 994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // compositor. This provider is bound and used on whichever thread the 1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // compositor is rendering from. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OffscreenCompositorContextProvider() = 0; 1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Return a reference to a shared offscreen context provider usable from the 1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // main thread. This may be the same as OffscreenCompositorContextProvider() 1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // depending on the compositor's threading configuration. This provider will 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // be bound to the main thread. 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) SharedMainThreadContextProvider() = 0; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroys per-compositor data. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RemoveCompositor(Compositor* compositor) = 0; 113c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 114c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // When true, the factory uses test contexts that do not do real GL 115c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch // operations. 116c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch virtual bool DoesCreateTestContexts() = 0; 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Texture provide an abstraction over the external texture that can be passed 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to a layer. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT Texture : public base::RefCounted<Texture> { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Texture(bool flipped, const gfx::Size& size, float device_scale_factor); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool flipped() const { return flipped_; } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size() const { return size_; } 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor() const { return device_scale_factor_; } 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual unsigned int PrepareTexture() = 0; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebKit::WebGraphicsContext3D* HostContext3D() = 0; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Replaces the texture with the texture from the specified mailbox. 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Consume(const std::string& mailbox_name, 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& new_size) {} 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Moves the texture into the mailbox and returns the mailbox name. 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The texture must have been previously consumed from a mailbox. 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual std::string Produce(); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Texture(); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size size_; // in pixel 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<Texture>; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool flipped_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor_; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Texture); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class represents a lock on the compositor, that can be used to prevent 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// commits to the compositor tree while we're waiting for an asynchronous 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// event. The typical use case is when waiting for a renderer to produce a frame 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at the right size. The caller keeps a reference on this object, and drops the 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reference once it desires to release the lock. 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note however that the lock is cancelled after a short timeout to ensure 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// responsiveness of the UI, so the compositor tree should be kept in a 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "reasonable" state while the lock is held. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Don't instantiate this class directly, use Compositor::GetCompositorLock. 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT CompositorLock 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCounted<CompositorLock>, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::SupportsWeakPtr<CompositorLock> { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<CompositorLock>; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class Compositor; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit CompositorLock(Compositor* compositor); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~CompositorLock(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelLock(); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Compositor* compositor_; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CompositorLock); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This is only to be used for test. It allows execution of other tasks on 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the current message loop before the current task finishs (there is a 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// potential for re-entrancy). 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class COMPOSITOR_EXPORT DrawWaiterForTest : public ui::CompositorObserver { 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Waits for a draw to be issued by the compositor. If the test times out 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // here, there may be a logic error in the compositor code causing it 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // not to draw. 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void Wait(Compositor* compositor); 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1885e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) // Waits for a commit instead of a draw. 1895e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) static void WaitForCommit(Compositor* compositor); 1905e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DrawWaiterForTest(); 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~DrawWaiterForTest(); 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void WaitImpl(Compositor* compositor); 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // CompositorObserver implementation. 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnCompositingDidCommit(Compositor* compositor) OVERRIDE; 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnCompositingStarted(Compositor* compositor, 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks start_time) OVERRIDE; 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnCompositingEnded(Compositor* compositor) OVERRIDE; 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnCompositingAborted(Compositor* compositor) OVERRIDE; 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnCompositingLockStateChanged(Compositor* compositor) OVERRIDE; 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnUpdateVSyncParameters(Compositor* compositor, 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks timebase, 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta interval) OVERRIDE; 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::RunLoop> wait_run_loop_; 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2105e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) bool wait_for_commit_; 2115e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DrawWaiterForTest); 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compositor object to take care of GPU painting. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A Browser compositor object is responsible for generating the final 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// displayable form of pixels comprising a single widget's contents. It draws an 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// appropriately transformed texture for each transformed view in the widget's 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// view hierarchy. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT Compositor 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : NON_EXPORTED_BASE(public cc::LayerTreeHostClient), 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public base::SupportsWeakPtr<Compositor> { 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) Compositor(bool use_software_renderer, 2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) gfx::AcceleratedWidget widget); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Compositor(); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void Initialize(); 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static bool WasInitializedWithThread(); 230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) static scoped_refptr<base::MessageLoopProxy> GetCompositorMessageLoop(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Terminate(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Schedules a redraw of the layer tree associated with this compositor. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ScheduleDraw(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the root of the layer tree drawn by this Compositor. The root layer 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must have no parent. The compositor's root layer is reset if the root layer 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is destroyed. NULL can be passed to reset the root layer, in which case the 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compositor will stop drawing anything. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The Compositor does not own the root layer. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Layer* root_layer() const { return root_layer_; } 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layer* root_layer() { return root_layer_; } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetRootLayer(Layer* root_layer); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when we need the compositor to preserve the alpha channel in the 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // output for situations when we want to render transparently atop something 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // else, e.g. Aero glass. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetHostHasTransparentBackground(bool host_has_transparent_background); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The scale factor of the device that this compositor is 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compositing layers on. 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor() const { return device_scale_factor_; } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Draws the scene created by the layer tree and any visual effects. 255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Draw(); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Where possible, draws are scissored to a damage region calculated from 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changes to layer properties. This bypasses that and indicates that 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the whole frame needs to be drawn. 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ScheduleFullRedraw(); 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Schedule redraw and append damage_rect to the damage region calculated 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // from changes to layer properties. 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ScheduleRedrawRect(const gfx::Rect& damage_rect); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 266868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void SetLatencyInfo(const ui::LatencyInfo& latency_info); 267868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reads the region |bounds_in_pixel| of the contents of the last rendered 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame into the given bitmap. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns false if the pixels could not be read. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ReadPixels(SkBitmap* bitmap, const gfx::Rect& bounds_in_pixel); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the compositor's device scale factor and size. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetScaleAndSize(float scale, const gfx::Size& size_in_pixel); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the size of the widget that is being drawn to in pixel coordinates. 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size() const { return size_; } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Sets the background color used for areas that aren't covered by 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the |root_layer|. 281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetBackgroundColor(SkColor color); 282c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the widget for this compositor. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::AcceleratedWidget widget() const { return widget_; } 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compositor does not own observers. It is the responsibility of the 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // observer to remove itself when it is done observing. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddObserver(CompositorObserver* observer); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveObserver(CompositorObserver* observer); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasObserver(CompositorObserver* observer); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a compositor lock. Returns NULL if it is not possible to lock at 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this time (i.e. we're waiting to complete a previous unlock). 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CompositorLock> GetCompositorLock(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal functions, called back by command-buffer contexts on swap buffer 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // events. 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has been posted. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersPosted(); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has completed. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersComplete(); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has aborted (e.g. lost context). 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersAborted(); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnUpdateVSyncParameters(base::TimeTicks timebase, 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta interval); 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LayerTreeHostClient implementation. 3121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void WillBeginMainFrame() OVERRIDE {} 3131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void DidBeginMainFrame() OVERRIDE {} 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Animate(double frame_begin_time) OVERRIDE {} 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE; 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float page_scale) OVERRIDE {} 318a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual scoped_ptr<cc::OutputSurface> CreateOutputSurface(bool fallback) 319a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) OVERRIDE; 320b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) virtual void DidInitializeOutputSurface(bool success) OVERRIDE {} 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void WillCommit() OVERRIDE {} 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE; 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE; 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCompleteSwapBuffers() OVERRIDE; 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ScheduleComposite() OVERRIDE; 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) OffscreenContextProvider() OVERRIDE; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_started_frame() { return last_started_frame_; } 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_ended_frame() { return last_ended_frame_; } 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsLocked() { return compositor_lock_ != NULL; } 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const cc::LayerTreeDebugState& GetLayerTreeDebugState() const; 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetLayerTreeDebugState(const cc::LayerTreeDebugState& debug_state); 336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Should the compositor use a software output device. If false, it may still 3381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // use a software output device if no GPU is available. 3391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool use_software_renderer() { return use_software_renderer_; } 3401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<Compositor>; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class CompositorLock; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by CompositorLock. 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnlockCompositor(); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to release any pending CompositorLock 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelCompositorLock(); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies the compositor that compositing is complete. 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyEnd(); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size_; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The root of the Layer tree drawn by this compositor. 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layer* root_layer_; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverList<CompositorObserver> observer_list_; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::AcceleratedWidget widget_; 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<cc::Layer> root_web_layer_; 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::LayerTreeHost> host_; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to verify that we have at most one draw swap in flight. 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PostedSwapQueue> posted_swaps_; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The device scale factor of the monitor that this compositor is compositing 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // layers on. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor_; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_started_frame_; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_ended_frame_; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool next_draw_is_resize_; 376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool disable_schedule_composite_; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompositorLock* compositor_lock_; 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Prevent more than one draw from being scheduled. 3828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool defer_draw_scheduling_; 3838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Used to prevent Draw()s while a composite is in progress. 3858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool waiting_on_compositing_end_; 3868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool draw_on_compositing_end_; 3878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) base::WeakPtrFactory<Compositor> schedule_draw_factory_; 3898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool use_software_renderer_; 3911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Compositor); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // UI_COMPOSITOR_COMPOSITOR_H_ 398