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.
5 #ifndef ANDROID_WEBVIEW_BROWSER_SHARED_RENDERER_STATE_H_
6 #define ANDROID_WEBVIEW_BROWSER_SHARED_RENDERER_STATE_H_
8 #include "android_webview/browser/gl_view_renderer_manager.h"
9 #include "android_webview/browser/parent_compositor_draw_constraints.h"
10 #include "base/cancelable_callback.h"
11 #include "base/memory/weak_ptr.h"
12 #include "base/single_thread_task_runner.h"
13 #include "base/synchronization/lock.h"
14 #include "cc/output/compositor_frame_ack.h"
15 #include "ui/gfx/geometry/rect.h"
16 #include "ui/gfx/geometry/vector2d.h"
20 namespace android_webview
{
23 class RequestDrawGLTracker
;
26 class BrowserViewRenderer
;
28 class HardwareRenderer
;
29 class InsideHardwareReleaseReset
;
31 // This class is used to pass data between UI thread and RenderThread.
32 class SharedRendererState
{
35 const scoped_refptr
<base::SingleThreadTaskRunner
>& ui_loop
,
36 BrowserViewRenderer
* browser_view_renderer
);
37 ~SharedRendererState();
39 // This function can be called from any thread.
40 void ClientRequestDrawGL();
43 void SetScrollOffsetOnUI(gfx::Vector2d scroll_offset
);
44 void SetCompositorFrameOnUI(scoped_ptr
<ChildFrame
> frame
);
45 void InitializeHardwareDrawIfNeededOnUI();
46 void ReleaseHardwareDrawIfNeededOnUI();
47 ParentCompositorDrawConstraints
GetParentDrawConstraintsOnUI() const;
48 void SwapReturnedResourcesOnUI(cc::ReturnedResourceArray
* resources
);
49 bool ReturnedResourcesEmptyOnUI() const;
50 scoped_ptr
<ChildFrame
> PassUncommittedFrameOnUI();
51 void DeleteHardwareRendererOnUI();
54 gfx::Vector2d
GetScrollOffsetOnRT();
55 scoped_ptr
<ChildFrame
> PassCompositorFrameOnRT();
56 void DrawGL(AwDrawGLInfo
* draw_info
);
57 void PostExternalDrawConstraintsToChildCompositorOnRT(
58 const ParentCompositorDrawConstraints
& parent_draw_constraints
);
59 void InsertReturnedResourcesOnRT(const cc::ReturnedResourceArray
& resources
);
62 friend class internal::RequestDrawGLTracker
;
63 class InsideHardwareReleaseReset
{
65 explicit InsideHardwareReleaseReset(
66 SharedRendererState
* shared_renderer_state
);
67 ~InsideHardwareReleaseReset();
70 SharedRendererState
* shared_renderer_state_
;
74 void DidDrawGLProcess();
77 void ResetRequestDrawGLCallback();
78 void ClientRequestDrawGLOnUI();
79 void UpdateParentDrawConstraintsOnUI();
80 bool IsInsideHardwareRelease() const;
81 void SetInsideHardwareRelease(bool inside
);
82 void ReleaseCompositorResourcesIfNeededOnUI(bool release_hardware_draw
);
84 // Accessed by UI thread.
85 scoped_refptr
<base::SingleThreadTaskRunner
> ui_loop_
;
86 BrowserViewRenderer
* browser_view_renderer_
;
87 base::WeakPtr
<SharedRendererState
> ui_thread_weak_ptr_
;
88 base::CancelableClosure request_draw_gl_cancelable_closure_
;
90 // Accessed by RT thread.
91 scoped_ptr
<HardwareRenderer
> hardware_renderer_
;
93 // This is accessed by both UI and RT now. TODO(hush): move to RT only.
94 GLViewRendererManager::Key renderer_manager_key_
;
96 // Accessed by both UI and RT thread.
97 mutable base::Lock lock_
;
98 gfx::Vector2d scroll_offset_
;
99 scoped_ptr
<ChildFrame
> child_frame_
;
100 bool inside_hardware_release_
;
101 ParentCompositorDrawConstraints parent_draw_constraints_
;
102 cc::ReturnedResourceArray returned_resources_
;
103 base::Closure request_draw_gl_closure_
;
105 base::WeakPtrFactory
<SharedRendererState
> weak_factory_on_ui_thread_
;
107 DISALLOW_COPY_AND_ASSIGN(SharedRendererState
);
110 } // namespace android_webview
112 #endif // ANDROID_WEBVIEW_BROWSER_SHARED_RENDERER_STATE_H_