12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CONTENT_RENDERER_GPU_RENDER_WIDGET_COMPOSITOR_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CONTENT_RENDERER_GPU_RENDER_WIDGET_COMPOSITOR_H_ 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/callback.h" 990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/weak_ptr.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "base/values.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/base/swap_promise.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "cc/base/swap_promise_monitor.h" 1490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "cc/input/top_controls_state.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" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/trees/layer_tree_settings.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/common/content_export.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebLayerTreeView.h" 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "third_party/skia/include/core/SkBitmap.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/rect.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace ui { 2490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)struct LatencyInfo; 2590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc { 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class InputHandler; 293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class Layer; 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class LayerTreeHost; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RenderWidget; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass CONTENT_EXPORT RenderWidgetCompositor 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : NON_EXPORTED_BASE(public blink::WebLayerTreeView), 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NON_EXPORTED_BASE(public cc::LayerTreeHostClient), 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci NON_EXPORTED_BASE(public cc::LayerTreeHostSingleThreadClient) { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Attempt to construct and initialize a compositor instance for the widget 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // with the given settings. Returns NULL if initialization fails. 43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch static scoped_ptr<RenderWidgetCompositor> Create(RenderWidget* widget, 44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch bool threaded); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~RenderWidgetCompositor(); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const base::WeakPtr<cc::InputHandler>& GetInputHandler(); 491e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool BeginMainFrameRequested() const; 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetNeedsDisplayOnAllLayers(); 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void SetRasterizeOnlyVisibleContent(); 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void UpdateTopControlsState(cc::TopControlsState constraints, 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) cc::TopControlsState current, 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool animate); 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetTopControlsLayoutHeight(float height); 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void SetNeedsRedrawRect(gfx::Rect damage_rect); 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Like setNeedsRedraw but forces the frame to be drawn, without early-outs. 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Redraw will be forced after the next commit 594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void SetNeedsForcedRedraw(); 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Calling CreateLatencyInfoSwapPromiseMonitor() to get a scoped 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // LatencyInfoSwapPromiseMonitor. During the life time of the 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // LatencyInfoSwapPromiseMonitor, if SetNeedsCommit() or SetNeedsUpdateLayer() 63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // is called on LayerTreeHost, the original latency info will be turned 64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // into a LatencyInfoSwapPromise. 65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<cc::SwapPromiseMonitor> CreateLatencyInfoSwapPromiseMonitor( 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::LatencyInfo* latency); 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Calling QueueSwapPromise() to directly queue a SwapPromise into 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // LayerTreeHost. 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void QueueSwapPromise(scoped_ptr<cc::SwapPromise> swap_promise); 70a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch int GetLayerTreeId() const; 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int GetSourceFrameNumber() const; 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void SetNeedsCommit(); 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void NotifyInputThrottledUntilCommit(); 743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const cc::Layer* GetRootLayer() const; 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int ScheduleMicroBenchmark( 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::string& name, 778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<base::Value> value, 784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::Callback<void(scoped_ptr<base::Value>)>& callback); 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool SendMessageToMicroBenchmark(int id, scoped_ptr<base::Value> value); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // WebLayerTreeView implementation. 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void setSurfaceReady(); 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void setRootLayer(const blink::WebLayer& layer); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void clearRootLayer(); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void setViewportSize( 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebSize& unused_deprecated, 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebSize& device_viewport_size); 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void setViewportSize(const blink::WebSize& device_viewport_size); 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual blink::WebSize layoutViewportSize() const; 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual blink::WebSize deviceViewportSize() const; 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual blink::WebFloatPoint adjustEventPointForPinchZoom( 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebFloatPoint& point) const; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void setDeviceScaleFactor(float device_scale); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual float deviceScaleFactor() const; 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void setBackgroundColor(blink::WebColor color); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void setHasTransparentBackground(bool transparent); 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void setOverhangBitmap(const SkBitmap& bitmap); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void setVisible(bool visible); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void setPageScaleFactorAndLimits(float page_scale_factor, 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float minimum, 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float maximum); 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void startPageScaleAnimation(const blink::WebPoint& destination, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool use_anchor, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float new_page_scale, 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double duration_sec); 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void heuristicsForGpuRasterizationUpdated(bool matches_heuristics); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void setNeedsAnimate(); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool commitRequested() const; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void didStopFlinging(); 110010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void compositeAndReadbackAsync( 111010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) blink::WebCompositeAndReadbackAsyncCallback* callback); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void finishAllRendering(); 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void setDeferCommits(bool defer_commits); 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void registerForAnimations(blink::WebLayer* layer); 115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void registerViewportLayers( 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebLayer* pageScaleLayer, 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebLayer* innerViewportScrollLayer, 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebLayer* outerViewportScrollLayer) OVERRIDE; 119d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) virtual void clearViewportLayers() OVERRIDE; 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void registerSelection(const blink::WebSelectionBound& start, 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const blink::WebSelectionBound& end) OVERRIDE; 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual void clearSelection() OVERRIDE; 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void setShowFPSCounter(bool show); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void setShowPaintRects(bool show); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void setShowDebugBorders(bool show); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void setContinuousPaintingEnabled(bool enabled); 1277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void setShowScrollBottleneckRects(bool show); 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void setTopControlsContentOffset(float); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // cc::LayerTreeHostClient implementation. 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void WillBeginMainFrame(int frame_id) OVERRIDE; 1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void DidBeginMainFrame() OVERRIDE; 13303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) virtual void BeginMainFrame(const cc::BeginFrameArgs& args) OVERRIDE; 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void Layout() OVERRIDE; 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta, 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci float page_scale, 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci float top_controls_delta) OVERRIDE; 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void RequestNewOutputSurface(bool fallback) OVERRIDE; 1395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void DidInitializeOutputSurface() OVERRIDE; 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void WillCommit() OVERRIDE; 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommit() OVERRIDE; 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCommitAndDrawFrame() OVERRIDE; 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DidCompleteSwapBuffers() OVERRIDE; 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void RateLimitSharedMainThreadContext() OVERRIDE; 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // cc::LayerTreeHostSingleThreadClient implementation. 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void ScheduleAnimation() OVERRIDE; 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidPostSwapBuffers() OVERRIDE; 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void DidAbortSwapBuffers() OVERRIDE; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) private: 152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch RenderWidgetCompositor(RenderWidget* widget, bool threaded); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Initialize(cc::LayerTreeSettings settings); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool threaded_; 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RenderWidget* widget_; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<cc::LayerTreeHost> layer_tree_host_; 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool send_v8_idle_notification_after_commit_; 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeTicks begin_main_frame_time_; 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The time interval between BeginMainFrame calls, provided by the scheduler. 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::TimeDelta begin_main_frame_interval_; 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CONTENT_RENDERER_GPU_RENDER_WIDGET_COMPOSITOR_H_ 169