Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / android_webview / browser / shared_renderer_state.h
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef ANDROID_WEBVIEW_BROWSER_SHARED_RENDERER_STATE_H_
6 #define ANDROID_WEBVIEW_BROWSER_SHARED_RENDERER_STATE_H_
7
8 #include "android_webview/browser/parent_compositor_draw_constraints.h"
9 #include "base/cancelable_callback.h"
10 #include "base/memory/weak_ptr.h"
11 #include "base/message_loop/message_loop_proxy.h"
12 #include "base/synchronization/lock.h"
13 #include "cc/output/compositor_frame.h"
14 #include "cc/output/compositor_frame_ack.h"
15 #include "ui/gfx/geometry/rect.h"
16 #include "ui/gfx/geometry/vector2d.h"
17
18 namespace cc {
19 class CompositorFrameAck;
20 }
21
22 namespace gpu {
23 class GLInProcessContext;
24 }
25
26 namespace android_webview {
27
28 namespace internal {
29 class RequestDrawGLTracker;
30 }
31
32 class BrowserViewRendererClient;
33 class InsideHardwareReleaseReset;
34
35 // Set by BrowserViewRenderer and read by HardwareRenderer.
36 struct DrawGLInput {
37   gfx::Vector2d scroll_offset;
38   int width;
39   int height;
40   cc::CompositorFrame frame;
41
42   DrawGLInput();
43   ~DrawGLInput();
44 };
45
46 // This class is used to pass data between UI thread and RenderThread.
47 class SharedRendererState {
48  public:
49   SharedRendererState(scoped_refptr<base::MessageLoopProxy> ui_loop,
50                       BrowserViewRendererClient* client);
51   ~SharedRendererState();
52
53   void ClientRequestDrawGL();
54   void DidDrawGLProcess();
55
56   void SetDrawGLInput(scoped_ptr<DrawGLInput> input);
57   scoped_ptr<DrawGLInput> PassDrawGLInput();
58
59   bool IsInsideHardwareRelease() const;
60   void UpdateDrawConstraints(
61       const ParentCompositorDrawConstraints& parent_draw_constraints);
62   void PostExternalDrawConstraintsToChildCompositor(
63       const ParentCompositorDrawConstraints& parent_draw_constraints);
64
65   const ParentCompositorDrawConstraints ParentDrawConstraints() const;
66
67   void SetSharedContext(gpu::GLInProcessContext* context);
68   gpu::GLInProcessContext* GetSharedContext() const;
69
70   void InsertReturnedResources(const cc::ReturnedResourceArray& resources);
71   void SwapReturnedResources(cc::ReturnedResourceArray* resources);
72   bool ReturnedResourcesEmpty() const;
73
74  private:
75   friend class InsideHardwareReleaseReset;
76   friend class internal::RequestDrawGLTracker;
77
78   void ResetRequestDrawGLCallback();
79   void ClientRequestDrawGLOnUIThread();
80   void UpdateParentDrawConstraintsOnUIThread();
81   void SetInsideHardwareRelease(bool inside);
82
83   scoped_refptr<base::MessageLoopProxy> ui_loop_;
84   BrowserViewRendererClient* client_on_ui_;
85   base::WeakPtrFactory<SharedRendererState> weak_factory_on_ui_thread_;
86   base::WeakPtr<SharedRendererState> ui_thread_weak_ptr_;
87   base::CancelableClosure request_draw_gl_cancelable_closure_;
88
89   // Accessed by both UI and RT thread.
90   mutable base::Lock lock_;
91   scoped_ptr<DrawGLInput> draw_gl_input_;
92   bool inside_hardware_release_;
93   ParentCompositorDrawConstraints parent_draw_constraints_;
94   gpu::GLInProcessContext* share_context_;
95   cc::ReturnedResourceArray returned_resources_;
96   base::Closure request_draw_gl_closure_;
97
98   DISALLOW_COPY_AND_ASSIGN(SharedRendererState);
99 };
100
101 class InsideHardwareReleaseReset {
102  public:
103   explicit InsideHardwareReleaseReset(
104       SharedRendererState* shared_renderer_state);
105   ~InsideHardwareReleaseReset();
106
107  private:
108   SharedRendererState* shared_renderer_state_;
109
110   DISALLOW_COPY_AND_ASSIGN(InsideHardwareReleaseReset);
111 };
112
113 }  // namespace android_webview
114
115 #endif  // ANDROID_WEBVIEW_BROWSER_SHARED_RENDERER_STATE_H_