1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef ANDROID_WEBVIEW_BROWSER_HARDWARE_RENDERER_H_
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define ANDROID_WEBVIEW_BROWSER_HARDWARE_RENDERER_H_
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "android_webview/browser/parent_compositor_draw_constraints.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "android_webview/browser/shared_renderer_state.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/layers/delegated_frame_resource_collection.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/trees/layer_tree_host_client.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "cc/trees/layer_tree_host_single_thread_client.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)struct AwDrawGLInfo;
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace cc {
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class DelegatedFrameProvider;
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class DelegatedRendererLayer;
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class Layer;
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class LayerTreeHost;
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace android_webview {
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class AwGLSurface;
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ParentOutputSurface;
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class HardwareRenderer : public cc::LayerTreeHostClient,
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         public cc::LayerTreeHostSingleThreadClient,
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                         public cc::DelegatedFrameResourceCollectionClient {
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  explicit HardwareRenderer(SharedRendererState* state);
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~HardwareRenderer();
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void DrawGL(bool stencil_enabled,
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              int framebuffer_binding_ext,
38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              AwDrawGLInfo* draw_info);
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void CommitFrame();
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // cc::LayerTreeHostClient overrides.
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void WillBeginMainFrame(int frame_id) OVERRIDE {}
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void DidBeginMainFrame() OVERRIDE;
4403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual void BeginMainFrame(const cc::BeginFrameArgs& args) OVERRIDE {}
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void Layout() OVERRIDE {}
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   float page_scale,
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   float top_controls_delta) OVERRIDE {}
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void RequestNewOutputSurface(bool fallback) OVERRIDE;
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void DidInitializeOutputSurface() OVERRIDE {}
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void WillCommit() OVERRIDE {}
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void DidCommit() OVERRIDE {}
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void DidCommitAndDrawFrame() OVERRIDE {}
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void DidCompleteSwapBuffers() OVERRIDE {}
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // cc::LayerTreeHostSingleThreadClient overrides.
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void DidPostSwapBuffers() OVERRIDE {}
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void DidAbortSwapBuffers() OVERRIDE {}
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // cc::DelegatedFrameResourceCollectionClient overrides.
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void UnusedResourcesAreAvailable() OVERRIDE;
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SetFrameData();
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  SharedRendererState* shared_renderer_state_;
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  typedef void* EGLContext;
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EGLContext last_egl_context_;
70a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
7134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  scoped_ptr<cc::CompositorFrame> committed_frame_;
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Information about last delegated frame.
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  gfx::Size frame_size_;
7534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
7634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  // Infromation from UI on last commit.
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Vector2d scroll_offset_;
7834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  int width_;
7934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)  int height_;
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Information from draw.
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Size viewport_;
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  gfx::Rect clip_;
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool stencil_enabled_;
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool viewport_clip_valid_for_dcheck_;
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_refptr<AwGLSurface> gl_surface_;
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<cc::LayerTreeHost> layer_tree_host_;
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<cc::Layer> root_layer_;
91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<cc::DelegatedFrameResourceCollection> resource_collection_;
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<cc::DelegatedFrameProvider> frame_provider_;
94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_refptr<cc::DelegatedRendererLayer> delegated_layer_;
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This is owned indirectly by |layer_tree_host_|.
97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ParentOutputSurface* output_surface_;
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ParentCompositorDrawConstraints draw_constraints_;
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(HardwareRenderer);
102a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}  // namespace android_webview
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif  // ANDROID_WEBVIEW_BROWSER_HARDWARE_RENDERER_H_
107