Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1080)

Unified Diff: android_webview/browser/browser_view_renderer.h

Issue 176543004: aw: Split hardware rendering into HardwareRenderer (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: review comments Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « android_webview/android_webview.gyp ('k') | android_webview/browser/browser_view_renderer.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: android_webview/browser/browser_view_renderer.h
diff --git a/android_webview/browser/browser_view_renderer.h b/android_webview/browser/browser_view_renderer.h
index 5b2056d17b26b68284c4f31caa42305fcbd8e70c..1fcc54ffbecf56d96dd2fef48cdc65ab7522488d 100644
--- a/android_webview/browser/browser_view_renderer.h
+++ b/android_webview/browser/browser_view_renderer.h
@@ -7,6 +7,8 @@
#include "base/android/scoped_java_ref.h"
#include "base/callback.h"
+#include "base/cancelable_callback.h"
+#include "content/public/browser/android/synchronous_compositor_client.h"
#include "skia/ext/refptr.h"
#include "ui/gfx/point.h"
#include "ui/gfx/rect.h"
@@ -19,128 +21,227 @@ struct AwDrawSWFunctionTable;
namespace content {
class ContentViewCore;
+class SynchronousCompositor;
+class WebContents;
}
namespace android_webview {
-// Interface for all the WebView-specific content rendering operations.
-// Provides software and hardware rendering and the Capture Picture API.
-class BrowserViewRenderer {
- public:
- class Client {
- public:
- // Request DrawGL be called. Passing null canvas implies the request
- // will be of AwDrawGLInfo::kModeProcess type. The callback
- // may never be made, and the mode may be promoted to kModeDraw.
- virtual bool RequestDrawGL(jobject canvas) = 0;
+class HardwareRenderer;
- // Called when a new Picture is available. Needs to be enabled
- // via the EnableOnNewPicture method.
- virtual void OnNewPicture() = 0;
-
- // Called to trigger view invalidations.
- virtual void PostInvalidate() = 0;
+class BrowserViewRendererClient {
+ public:
+ // Request DrawGL be called. Passing null |canvas| implies the request
+ // will be of AwDrawGLInfo::kModeProcess type. The callback
+ // may never be made, and the mode may be promoted to kModeDraw.
+ virtual bool RequestDrawGL(jobject canvas) = 0;
- // Synchronously call back to SetGlobalVisibleRect with current value.
- virtual void UpdateGlobalVisibleRect() = 0;
+ // Called when a new Picture is available. Needs to be enabled
+ // via the EnableOnNewPicture method.
+ virtual void OnNewPicture() = 0;
- // Called to get view's absolute location on the screen.
- virtual gfx::Point GetLocationOnScreen() = 0;
+ // Called to trigger view invalidations.
+ virtual void PostInvalidate() = 0;
- // Try to set the view's scroll offset to |new_value|.
- virtual void ScrollContainerViewTo(gfx::Vector2d new_value) = 0;
+ // Synchronously call back to SetGlobalVisibleRect with current value.
+ virtual void UpdateGlobalVisibleRect() = 0;
- // Set the view's scroll offset cap to |new_value|.
- virtual void SetMaxContainerViewScrollOffset(gfx::Vector2d new_value) = 0;
+ // Called to get view's absolute location on the screen.
+ virtual gfx::Point GetLocationOnScreen() = 0;
- // Is a WebView-managed fling in progress?
- virtual bool IsFlingActive() const = 0;
+ // Try to set the view's scroll offset to |new_value|.
+ virtual void ScrollContainerViewTo(gfx::Vector2d new_value) = 0;
- // Set the current page scale to |page_scale_factor| and page scale limits
- // to |min_page_scale_factor|..|max_page_scale_factor|.
- virtual void SetPageScaleFactorAndLimits(float page_scale_factor,
- float min_page_scale_factor,
- float max_page_scale_factor) = 0;
+ // Set the view's scroll offset cap to |new_value|.
+ virtual void SetMaxContainerViewScrollOffset(gfx::Vector2d new_value) = 0;
- // Set the current contents_size to |contents_size_dip|.
- virtual void SetContentsSize(gfx::SizeF contents_size_dip) = 0;
+ // Is a Android view system managed fling in progress?
+ virtual bool IsFlingActive() const = 0;
- // Handle overscroll.
- virtual void DidOverscroll(gfx::Vector2d overscroll_delta) = 0;
+ // Set the current page scale to |page_scale_factor| and page scale limits
+ // to |min_page_scale_factor|..|max_page_scale_factor|.
+ virtual void SetPageScaleFactorAndLimits(float page_scale_factor,
+ float min_page_scale_factor,
+ float max_page_scale_factor) = 0;
- protected:
- virtual ~Client() {}
- };
+ // Set the current contents_size to |contents_size_dip|.
+ virtual void SetContentsSize(gfx::SizeF contents_size_dip) = 0;
- // Delegate to perform rendering actions involving Java objects.
- class JavaHelper {
- public:
- static JavaHelper* GetInstance();
+ // Handle overscroll.
+ virtual void DidOverscroll(gfx::Vector2d overscroll_delta) = 0;
- typedef base::Callback<bool(SkCanvas*)> RenderMethod;
- virtual bool RenderViaAuxilaryBitmapIfNeeded(
- jobject java_canvas,
- const gfx::Vector2d& scroll_correction,
- const gfx::Rect& clip,
- RenderMethod render_source) = 0;
+ protected:
+ virtual ~BrowserViewRendererClient() {}
+};
- protected:
- virtual ~JavaHelper() {}
- };
+// Delegate to perform rendering actions involving Java objects.
+class BrowserViewRendererJavaHelper {
+ public:
+ static BrowserViewRendererJavaHelper* GetInstance();
+
+ typedef base::Callback<bool(SkCanvas*)> RenderMethod;
+
+ // Try obtaining the native SkCanvas from |java_canvas| and call
+ // |render_source| with it. If that fails, allocate an auxilary bitmap
+ // for |render_source| to render into, then copy the bitmap into
+ // |java_canvas|.
+ virtual bool RenderViaAuxilaryBitmapIfNeeded(
+ jobject java_canvas,
+ const gfx::Vector2d& scroll_correction,
+ const gfx::Rect& clip,
+ RenderMethod render_source) = 0;
+
+ protected:
+ virtual ~BrowserViewRendererJavaHelper() {}
+};
- // Global hookup methods.
- static void SetAwDrawSWFunctionTable(AwDrawSWFunctionTable* table);
+// Interface for all the WebView-specific content rendering operations.
+// Provides software and hardware rendering and the Capture Picture API.
+class BrowserViewRenderer : public content::SynchronousCompositorClient {
+ public:
+ BrowserViewRenderer(BrowserViewRendererClient* client,
+ content::WebContents* web_contents);
- // Rendering methods.
+ virtual ~BrowserViewRenderer();
// Main handler for view drawing: performs a SW draw immediately, or sets up
- // a subsequent GL Draw (via Client::RequestDrawGL) and returns true. A false
- // return value indicates nothing was or will be drawn.
+ // a subsequent GL Draw (via BrowserViewRendererClient::RequestDrawGL) and
+ // returns true. A false return value indicates nothing was or will be drawn.
// |java_canvas| is the target of the draw. |is_hardware_canvas| indicates
// a GL Draw maybe possible on this canvas. |scroll| if the view's current
// scroll offset. |clip| is the canvas's clip bounds. |visible_rect| is the
// intersection of the view size and the window in window coordinates.
- virtual bool OnDraw(jobject java_canvas,
- bool is_hardware_canvas,
- const gfx::Vector2d& scroll,
- const gfx::Rect& clip) = 0;
+ bool OnDraw(jobject java_canvas,
+ bool is_hardware_canvas,
+ const gfx::Vector2d& scroll,
+ const gfx::Rect& clip);
- // Called in response to a prior Client::RequestDrawGL() call. See
- // AwDrawGLInfo documentation for more details of the contract.
- virtual void DrawGL(AwDrawGLInfo* draw_info) = 0;
+ // Called in response to a prior BrowserViewRendererClient::RequestDrawGL()
+ // call. See AwDrawGLInfo documentation for more details of the contract.
+ void DrawGL(AwDrawGLInfo* draw_info);
// The global visible rect changed and this is the new value.
- virtual void SetGlobalVisibleRect(const gfx::Rect& visible_rect) = 0;
+ void SetGlobalVisibleRect(const gfx::Rect& visible_rect);
// CapturePicture API methods.
- virtual skia::RefPtr<SkPicture> CapturePicture(int width, int height) = 0;
- virtual void EnableOnNewPicture(bool enabled) = 0;
+ skia::RefPtr<SkPicture> CapturePicture(int width, int height);
+ void EnableOnNewPicture(bool enabled);
- virtual void ClearView() = 0;
+ void ClearView();
// View update notifications.
- virtual void SetIsPaused(bool paused) = 0;
- virtual void SetViewVisibility(bool visible) = 0;
- virtual void SetWindowVisibility(bool visible) = 0;
- virtual void OnSizeChanged(int width, int height) = 0;
- virtual void OnAttachedToWindow(int width, int height) = 0;
- virtual void OnDetachedFromWindow() = 0;
+ void SetIsPaused(bool paused);
+ void SetViewVisibility(bool visible);
+ void SetWindowVisibility(bool visible);
+ void OnSizeChanged(int width, int height);
+ void OnAttachedToWindow(int width, int height);
+ void OnDetachedFromWindow();
// Sets the scale for logical<->physical pixel conversions.
- virtual void SetDipScale(float dip_scale) = 0;
+ void SetDipScale(float dip_scale);
// Set the root layer scroll offset to |new_value|.
- virtual void ScrollTo(gfx::Vector2d new_value) = 0;
+ void ScrollTo(gfx::Vector2d new_value);
// Android views hierarchy gluing.
- virtual bool IsAttachedToWindow() = 0;
- virtual bool IsVisible() = 0;
- virtual gfx::Rect GetScreenRect() = 0;
+ bool IsAttachedToWindow() const;
+ bool IsVisible() const;
+ gfx::Rect GetScreenRect() const;
// ComponentCallbacks2.onTrimMemory callback.
- virtual void TrimMemory(int level) = 0;
-
- virtual ~BrowserViewRenderer() {}
+ void TrimMemory(int level);
+
+ // SynchronousCompositorClient overrides
+ virtual void DidInitializeCompositor(
+ content::SynchronousCompositor* compositor) OVERRIDE;
+ virtual void DidDestroyCompositor(content::SynchronousCompositor* compositor)
+ OVERRIDE;
+ virtual void SetContinuousInvalidate(bool invalidate) OVERRIDE;
+ virtual void SetMaxRootLayerScrollOffset(gfx::Vector2dF new_value) OVERRIDE;
+ virtual void SetTotalRootLayerScrollOffset(gfx::Vector2dF new_value_css)
+ OVERRIDE;
+ virtual void DidUpdateContent() OVERRIDE;
+ virtual gfx::Vector2dF GetTotalRootLayerScrollOffset() OVERRIDE;
+ virtual bool IsExternalFlingActive() const OVERRIDE;
+ virtual void SetRootLayerPageScaleFactorAndLimits(float page_scale_factor,
+ float min_page_scale_factor,
+ float max_page_scale_factor)
+ OVERRIDE;
+ virtual void SetRootLayerScrollableSize(gfx::SizeF scrollable_size) OVERRIDE;
+ virtual void DidOverscroll(gfx::Vector2dF accumulated_overscroll,
+ gfx::Vector2dF latest_overscroll_delta,
+ gfx::Vector2dF current_fling_velocity) OVERRIDE;
+
+ private:
+ // Checks the continuous invalidate and block invalidate state, and schedule
+ // invalidates appropriately. If |invalidate_ignore_compositor| is true,
+ // then send a view invalidate regardless of compositor expectation.
+ void EnsureContinuousInvalidation(AwDrawGLInfo* draw_info,
+ bool invalidate_ignore_compositor);
+ bool DrawSWInternal(jobject java_canvas, const gfx::Rect& clip_bounds);
+ bool CompositeSW(SkCanvas* canvas);
+
+ // If we call up view invalidate and OnDraw is not called before a deadline,
+ // then we keep ticking the SynchronousCompositor so it can make progress.
+ void FallbackTickFired();
+ void ForceFakeCompositeSW();
+
+ gfx::Vector2d max_scroll_offset() const;
+
+ // For debug tracing or logging. Return the string representation of this
+ // view renderer's state and the |draw_info| if provided.
+ std::string ToString(AwDrawGLInfo* draw_info) const;
+
+ BrowserViewRendererClient* client_;
+ content::WebContents* web_contents_;
+ content::SynchronousCompositor* compositor_;
+
+ scoped_ptr<HardwareRenderer> hardware_renderer_;
+
+ bool is_paused_;
+ bool view_visible_;
+ bool window_visible_; // Only applicable if |attached_to_window_| is true.
+ bool attached_to_window_;
+ float dip_scale_;
+ float page_scale_factor_;
+ bool on_new_picture_enable_;
+ bool clear_view_;
+
+ // When true, we should continuously invalidate and keep drawing, for example
+ // to drive animation. This value is set by the compositor and should always
+ // reflect the expectation of the compositor and not be reused for other
+ // states.
+ bool compositor_needs_continuous_invalidate_;
+
+ // Used to block additional invalidates while one is already pending or before
+ // compositor draw which may switch continuous_invalidate on and off in the
+ // process.
+ bool block_invalidates_;
+
+ // Holds a callback to FallbackTickFired while it is pending.
+ base::CancelableClosure fallback_tick_;
+
+ int width_;
+ int height_;
+
+ // Should always call UpdateGlobalVisibleRect before using this.
+ gfx::Rect cached_global_visible_rect_;
+
+ // Last View scroll when View.onDraw() was called.
+ gfx::Vector2d scroll_at_start_of_frame_;
+
+ // Current scroll offset in CSS pixels.
+ gfx::Vector2dF scroll_offset_dip_;
+
+ // Max scroll offset in CSS pixels.
+ gfx::Vector2dF max_scroll_offset_dip_;
+
+ // Used to prevent rounding errors from accumulating enough to generate
+ // visible skew (especially noticeable when scrolling up and down in the same
+ // spot over a period of time).
+ gfx::Vector2dF overscroll_rounding_error_;
+
+ DISALLOW_COPY_AND_ASSIGN(BrowserViewRenderer);
};
} // namespace android_webview
« no previous file with comments | « android_webview/android_webview.gyp ('k') | android_webview/browser/browser_view_renderer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698