compositor.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/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" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/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 { 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; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLContext; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLSurface; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GLShareGroup; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Point; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace WebKit { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class WebGraphicsContext3D; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Compositor; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CompositorObserver; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ContextProviderFromContextFactory; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Layer; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PostedSwapQueue; 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. 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual cc::OutputSurface* CreateOutputSurface( 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Compositor* compositor) = 0; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a context used for offscreen rendering. This context can be shared 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // with all compositors. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebKit::WebGraphicsContext3D* CreateOffscreenContext() = 0; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OffscreenContextProviderForMainThread() = 0; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OffscreenContextProviderForCompositorThread() = 0; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Destroys per-compositor data. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RemoveCompositor(Compositor* compositor) = 0; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The default factory that creates in-process contexts. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT DefaultContextFactory : public ContextFactory { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DefaultContextFactory(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~DefaultContextFactory(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ContextFactory implementation 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual cc::OutputSurface* CreateOutputSurface( 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Compositor* compositor) OVERRIDE; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebKit::WebGraphicsContext3D* CreateOffscreenContext() OVERRIDE; 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OffscreenContextProviderForMainThread() OVERRIDE; 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OffscreenContextProviderForCompositorThread() OVERRIDE; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RemoveCompositor(Compositor* compositor) OVERRIDE; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Initialize(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebGraphicsContext3D* CreateContextCommon( 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Compositor* compositor, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool offscreen); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContextProviderFromContextFactory> 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) offscreen_contexts_main_thread_; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContextProviderFromContextFactory> 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) offscreen_contexts_compositor_thread_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DefaultContextFactory); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The factory that creates test contexts. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class COMPOSITOR_EXPORT TestContextFactory : public ContextFactory { 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestContextFactory(); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~TestContextFactory(); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // ContextFactory implementation 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual cc::OutputSurface* CreateOutputSurface( 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Compositor* compositor) OVERRIDE; 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual WebKit::WebGraphicsContext3D* CreateOffscreenContext() OVERRIDE; 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OffscreenContextProviderForMainThread() OVERRIDE; 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OffscreenContextProviderForCompositorThread() OVERRIDE; 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void RemoveCompositor(Compositor* compositor) OVERRIDE; 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContextProviderFromContextFactory> 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) offscreen_contexts_main_thread_; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<ContextProviderFromContextFactory> 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) offscreen_contexts_compositor_thread_; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestContextFactory); 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Texture provide an abstraction over the external texture that can be passed 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to a layer. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT Texture : public base::RefCounted<Texture> { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Texture(bool flipped, const gfx::Size& size, float device_scale_factor); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool flipped() const { return flipped_; } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size() const { return size_; } 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor() const { return device_scale_factor_; } 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual unsigned int PrepareTexture() = 0; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WebKit::WebGraphicsContext3D* HostContext3D() = 0; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Replaces the texture with the texture from the specified mailbox. 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Consume(const std::string& mailbox_name, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Size& new_size) {} 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Moves the texture into the mailbox and returns the mailbox name. 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The texture must have been previously consumed from a mailbox. 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual std::string Produce(); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Texture(); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size size_; // in pixel 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<Texture>; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool flipped_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor_; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Texture); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interface to allow the compositor to communicate with its owner. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT CompositorDelegate { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Requests the owner to schedule a redraw of the layer tree. 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ScheduleDraw() = 0; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~CompositorDelegate() {} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class represents a lock on the compositor, that can be used to prevent 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// commits to the compositor tree while we're waiting for an asynchronous 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// event. The typical use case is when waiting for a renderer to produce a frame 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// at the right size. The caller keeps a reference on this object, and drops the 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// reference once it desires to release the lock. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Note however that the lock is cancelled after a short timeout to ensure 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// responsiveness of the UI, so the compositor tree should be kept in a 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "reasonable" state while the lock is held. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Don't instantiate this class directly, use Compositor::GetCompositorLock. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT CompositorLock 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public base::RefCounted<CompositorLock>, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public base::SupportsWeakPtr<CompositorLock> { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<CompositorLock>; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class Compositor; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit CompositorLock(Compositor* compositor); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~CompositorLock(); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelLock(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Compositor* compositor_; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CompositorLock); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This is only to be used for test. It allows execution of other tasks on 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// the current message loop before the current task finishs (there is a 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// potential for re-entrancy). 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class COMPOSITOR_EXPORT DrawWaiterForTest : public ui::CompositorObserver { 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Waits for a draw to be issued by the compositor. If the test times out 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // here, there may be a logic error in the compositor code causing it 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // not to draw. 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void Wait(Compositor* compositor); 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DrawWaiterForTest(); 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~DrawWaiterForTest(); 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void WaitImpl(Compositor* compositor); 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // CompositorObserver implementation. 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnCompositingDidCommit(Compositor* compositor) OVERRIDE; 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnCompositingStarted(Compositor* compositor, 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks start_time) OVERRIDE; 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnCompositingEnded(Compositor* compositor) OVERRIDE; 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnCompositingAborted(Compositor* compositor) OVERRIDE; 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnCompositingLockStateChanged(Compositor* compositor) OVERRIDE; 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnUpdateVSyncParameters(Compositor* compositor, 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeTicks timebase, 241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::TimeDelta interval) OVERRIDE; 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::RunLoop> wait_run_loop_; 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DrawWaiterForTest); 246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Compositor object to take care of GPU painting. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A Browser compositor object is responsible for generating the final 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// displayable form of pixels comprising a single widget's contents. It draws an 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// appropriately transformed texture for each transformed view in the widget's 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// view hierarchy. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class COMPOSITOR_EXPORT Compositor 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : NON_EXPORTED_BASE(public cc::LayerTreeHostClient), 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public base::SupportsWeakPtr<Compositor> { 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Compositor(CompositorDelegate* delegate, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::AcceleratedWidget widget); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~Compositor(); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static void Initialize(); 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static bool WasInitializedWithThread(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static void Terminate(); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Schedules a redraw of the layer tree associated with this compositor. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ScheduleDraw(); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the root of the layer tree drawn by this Compositor. The root layer 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // must have no parent. The compositor's root layer is reset if the root layer 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is destroyed. NULL can be passed to reset the root layer, in which case the 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compositor will stop drawing anything. 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The Compositor does not own the root layer. 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Layer* root_layer() const { return root_layer_; } 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layer* root_layer() { return root_layer_; } 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetRootLayer(Layer* root_layer); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when we need the compositor to preserve the alpha channel in the 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // output for situations when we want to render transparently atop something 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // else, e.g. Aero glass. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetHostHasTransparentBackground(bool host_has_transparent_background); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The scale factor of the device that this compositor is 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // compositing layers on. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor() const { return device_scale_factor_; } 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Draws the scene created by the layer tree and any visual effects. 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Draw(); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Where possible, draws are scissored to a damage region calculated from 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changes to layer properties. This bypasses that and indicates that 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the whole frame needs to be drawn. 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ScheduleFullRedraw(); 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Schedule redraw and append damage_rect to the damage region calculated 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // from changes to layer properties. 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void ScheduleRedrawRect(const gfx::Rect& damage_rect); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reads the region |bounds_in_pixel| of the contents of the last rendered 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frame into the given bitmap. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns false if the pixels could not be read. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool ReadPixels(SkBitmap* bitmap, const gfx::Rect& bounds_in_pixel); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the compositor's device scale factor and size. 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetScaleAndSize(float scale, const gfx::Size& size_in_pixel); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the size of the widget that is being drawn to in pixel coordinates. 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size() const { return size_; } 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 309c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Sets the background color used for areas that aren't covered by 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the |root_layer|. 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetBackgroundColor(SkColor color); 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the widget for this compositor. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::AcceleratedWidget widget() const { return widget_; } 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compositor does not own observers. It is the responsibility of the 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // observer to remove itself when it is done observing. 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddObserver(CompositorObserver* observer); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveObserver(CompositorObserver* observer); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasObserver(CompositorObserver* observer); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a compositor lock. Returns NULL if it is not possible to lock at 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this time (i.e. we're waiting to complete a previous unlock). 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CompositorLock> GetCompositorLock(); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Internal functions, called back by command-buffer contexts on swap buffer 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // events. 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has been posted. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersPosted(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has completed. 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersComplete(); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Signals swap has aborted (e.g. lost context). 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSwapBuffersAborted(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void OnUpdateVSyncParameters(base::TimeTicks timebase, 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta interval); 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LayerTreeHostClient implementation. 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void WillBeginFrame() OVERRIDE {} 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidBeginFrame() OVERRIDE {} 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Animate(double frame_begin_time) OVERRIDE {} 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE; 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ApplyScrollAndScale(gfx::Vector2d scroll_delta, 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float page_scale) OVERRIDE {} 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_ptr<cc::OutputSurface> 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateOutputSurface() OVERRIDE; 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidRecreateOutputSurface(bool success) OVERRIDE {} 351c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual scoped_ptr<cc::InputHandlerClient> CreateInputHandlerClient() 352c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) OVERRIDE; 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void WillCommit() OVERRIDE {} 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE; 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE; 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCompleteSwapBuffers() OVERRIDE; 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ScheduleComposite() OVERRIDE; 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OffscreenContextProviderForMainThread() OVERRIDE; 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<cc::ContextProvider> 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OffscreenContextProviderForCompositorThread() OVERRIDE; 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_started_frame() { return last_started_frame_; } 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_ended_frame() { return last_ended_frame_; } 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsLocked() { return compositor_lock_ != NULL; } 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const cc::LayerTreeDebugState& GetLayerTreeDebugState() const; 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetLayerTreeDebugState(const cc::LayerTreeDebugState& debug_state); 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCounted<Compositor>; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class CompositorLock; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by CompositorLock. 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnlockCompositor(); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to release any pending CompositorLock 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CancelCompositorLock(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notifies the compositor that compositing is complete. 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NotifyEnd(); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompositorDelegate* delegate_; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Size size_; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The root of the Layer tree drawn by this compositor. 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Layer* root_layer_; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObserverList<CompositorObserver> observer_list_; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::AcceleratedWidget widget_; 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<cc::Layer> root_web_layer_; 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::LayerTreeHost> host_; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to verify that we have at most one draw swap in flight. 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PostedSwapQueue> posted_swaps_; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The device scale factor of the monitor that this compositor is compositing 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // layers on. 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float device_scale_factor_; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_started_frame_; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int last_ended_frame_; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool next_draw_is_resize_; 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool disable_schedule_composite_; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CompositorLock* compositor_lock_; 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Compositor); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // UI_COMPOSITOR_COMPOSITOR_H_ 418