Home | History | Annotate | Download | only in browser
      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   // Returns true if the draw constraints are updated.
     61   bool UpdateDrawConstraints(
     62       const ParentCompositorDrawConstraints& parent_draw_constraints);
     63   void PostExternalDrawConstraintsToChildCompositor(
     64       const ParentCompositorDrawConstraints& parent_draw_constraints);
     65 
     66   const ParentCompositorDrawConstraints ParentDrawConstraints() const;
     67 
     68   void SetSharedContext(gpu::GLInProcessContext* context);
     69   gpu::GLInProcessContext* GetSharedContext() const;
     70 
     71   void SetForceInvalidateOnNextDrawGL(
     72       bool needs_force_invalidate_on_next_draw_gl);
     73   bool NeedsForceInvalidateOnNextDrawGL() const;
     74 
     75   void InsertReturnedResources(const cc::ReturnedResourceArray& resources);
     76   void SwapReturnedResources(cc::ReturnedResourceArray* resources);
     77   bool ReturnedResourcesEmpty() const;
     78 
     79  private:
     80   friend class InsideHardwareReleaseReset;
     81   friend class internal::RequestDrawGLTracker;
     82 
     83   void ResetRequestDrawGLCallback();
     84   void ClientRequestDrawGLOnUIThread();
     85   void UpdateParentDrawConstraintsOnUIThread();
     86   void SetInsideHardwareRelease(bool inside);
     87 
     88   scoped_refptr<base::MessageLoopProxy> ui_loop_;
     89   BrowserViewRendererClient* client_on_ui_;
     90   base::WeakPtrFactory<SharedRendererState> weak_factory_on_ui_thread_;
     91   base::WeakPtr<SharedRendererState> ui_thread_weak_ptr_;
     92   base::CancelableClosure request_draw_gl_cancelable_closure_;
     93 
     94   // Accessed by both UI and RT thread.
     95   mutable base::Lock lock_;
     96   scoped_ptr<DrawGLInput> draw_gl_input_;
     97   bool inside_hardware_release_;
     98   bool needs_force_invalidate_on_next_draw_gl_;
     99   ParentCompositorDrawConstraints parent_draw_constraints_;
    100   gpu::GLInProcessContext* share_context_;
    101   cc::ReturnedResourceArray returned_resources_;
    102   base::Closure request_draw_gl_closure_;
    103 
    104   DISALLOW_COPY_AND_ASSIGN(SharedRendererState);
    105 };
    106 
    107 class InsideHardwareReleaseReset {
    108  public:
    109   explicit InsideHardwareReleaseReset(
    110       SharedRendererState* shared_renderer_state);
    111   ~InsideHardwareReleaseReset();
    112 
    113  private:
    114   SharedRendererState* shared_renderer_state_;
    115 
    116   DISALLOW_COPY_AND_ASSIGN(InsideHardwareReleaseReset);
    117 };
    118 
    119 }  // namespace android_webview
    120 
    121 #endif  // ANDROID_WEBVIEW_BROWSER_SHARED_RENDERER_STATE_H_
    122