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.h"
15 #include "cc/output/compositor_frame_ack.h"
16 #include "ui/gfx/geometry/rect.h"
17 #include "ui/gfx/geometry/vector2d.h"
21 namespace android_webview
{
24 class RequestDrawGLTracker
;
27 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 bool HasCompositorFrameOnUI() const;
45 void SetCompositorFrameOnUI(scoped_ptr
<cc::CompositorFrame
> frame
,
47 void InitializeHardwareDrawIfNeededOnUI();
48 void ReleaseHardwareDrawIfNeededOnUI();
49 ParentCompositorDrawConstraints
GetParentDrawConstraintsOnUI() const;
50 void SetForceInvalidateOnNextDrawGLOnUI(
51 bool needs_force_invalidate_on_next_draw_gl
);
52 bool NeedsForceInvalidateOnNextDrawGLOnUI() const;
53 void SwapReturnedResourcesOnUI(cc::ReturnedResourceArray
* resources
);
54 bool ReturnedResourcesEmptyOnUI() const;
55 scoped_ptr
<cc::CompositorFrame
> PassUncommittedFrameOnUI();
58 gfx::Vector2d
GetScrollOffsetOnRT();
59 scoped_ptr
<cc::CompositorFrame
> PassCompositorFrameOnRT();
60 bool ForceCommitOnRT() const;
61 void DrawGL(AwDrawGLInfo
* draw_info
);
62 // Returns true if the draw constraints are updated.
63 bool UpdateDrawConstraintsOnRT(
64 const ParentCompositorDrawConstraints
& parent_draw_constraints
);
65 void PostExternalDrawConstraintsToChildCompositorOnRT(
66 const ParentCompositorDrawConstraints
& parent_draw_constraints
);
67 void DidSkipCommitFrameOnRT();
68 void InsertReturnedResourcesOnRT(const cc::ReturnedResourceArray
& resources
);
71 friend class internal::RequestDrawGLTracker
;
72 class InsideHardwareReleaseReset
{
74 explicit InsideHardwareReleaseReset(
75 SharedRendererState
* shared_renderer_state
);
76 ~InsideHardwareReleaseReset();
79 SharedRendererState
* shared_renderer_state_
;
83 void DidDrawGLProcess();
86 void ResetRequestDrawGLCallback();
87 void ClientRequestDrawGLOnUI();
88 void UpdateParentDrawConstraintsOnUI();
89 void DidSkipCommitFrameOnUI();
90 bool IsInsideHardwareRelease() const;
91 void SetInsideHardwareRelease(bool inside
);
93 // Accessed by UI thread.
94 scoped_refptr
<base::SingleThreadTaskRunner
> ui_loop_
;
95 BrowserViewRenderer
* browser_view_renderer_
;
96 base::WeakPtr
<SharedRendererState
> ui_thread_weak_ptr_
;
97 base::CancelableClosure request_draw_gl_cancelable_closure_
;
99 // Accessed by RT thread.
100 scoped_ptr
<HardwareRenderer
> hardware_renderer_
;
102 // This is accessed by both UI and RT now. TODO(hush): move to RT only.
103 GLViewRendererManager::Key renderer_manager_key_
;
105 // Accessed by both UI and RT thread.
106 mutable base::Lock lock_
;
107 gfx::Vector2d scroll_offset_
;
108 scoped_ptr
<cc::CompositorFrame
> compositor_frame_
;
110 bool inside_hardware_release_
;
111 bool needs_force_invalidate_on_next_draw_gl_
;
112 ParentCompositorDrawConstraints parent_draw_constraints_
;
113 cc::ReturnedResourceArray returned_resources_
;
114 base::Closure request_draw_gl_closure_
;
116 base::WeakPtrFactory
<SharedRendererState
> weak_factory_on_ui_thread_
;
118 DISALLOW_COPY_AND_ASSIGN(SharedRendererState
);
121 } // namespace android_webview
123 #endif // ANDROID_WEBVIEW_BROWSER_SHARED_RENDERER_STATE_H_