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