diff options
author | boliu <boliu@chromium.org> | 2015-06-29 14:08:12 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-06-29 21:08:43 +0000 |
commit | 7441045adbfba646724716930c674ea5d408c230 (patch) | |
tree | eb8630608a00937e2c3bc567d696613c96339836 | |
parent | c1edbf2a3303e63e940298dea2c2a9a68e4f0dda (diff) | |
download | chromium_src-7441045adbfba646724716930c674ea5d408c230.zip chromium_src-7441045adbfba646724716930c674ea5d408c230.tar.gz chromium_src-7441045adbfba646724716930c674ea5d408c230.tar.bz2 |
aw: Make is_layer match offscreen_pre_raster
When in layer, use the webview size to make tiling decisions (memory and
interect rect). This mostly matches offscreen_pre_raster behavior.
BUG=505133
Review URL: https://codereview.chromium.org/1221533002
Cr-Commit-Position: refs/heads/master@{#336638}
7 files changed, 28 insertions, 33 deletions
diff --git a/android_webview/browser/browser_view_renderer.cc b/android_webview/browser/browser_view_renderer.cc index 61a9192..7d15b89 100644 --- a/android_webview/browser/browser_view_renderer.cc +++ b/android_webview/browser/browser_view_renderer.cc @@ -170,9 +170,12 @@ void BrowserViewRenderer::UpdateMemoryPolicy() { if (g_memory_override_in_bytes) { bytes_limit = static_cast<size_t>(g_memory_override_in_bytes); } else { - gfx::Rect interest_rect = offscreen_pre_raster_ - ? gfx::Rect(size_) - : last_on_draw_global_visible_rect_; + ParentCompositorDrawConstraints parent_draw_constraints = + shared_renderer_state_.GetParentDrawConstraintsOnUI(); + gfx::Rect interest_rect = + offscreen_pre_raster_ || parent_draw_constraints.is_layer + ? gfx::Rect(size_) + : last_on_draw_global_visible_rect_; size_t width = interest_rect.width(); size_t height = interest_rect.height(); bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; @@ -240,12 +243,8 @@ bool BrowserViewRenderer::CompositeHw() { gfx::Rect viewport_rect_for_tile_priority; // Leave viewport_rect_for_tile_priority empty if offscreen_pre_raster_ is on. - if (!offscreen_pre_raster_) { - if (parent_draw_constraints.is_layer) { - viewport_rect_for_tile_priority = parent_draw_constraints.surface_rect; - } else { - viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; - } + if (!offscreen_pre_raster_ && !parent_draw_constraints.is_layer) { + viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; } scoped_ptr<cc::CompositorFrame> frame = @@ -262,7 +261,7 @@ bool BrowserViewRenderer::CompositeHw() { } scoped_ptr<ChildFrame> child_frame = make_scoped_ptr( - new ChildFrame(frame.Pass(), viewport_rect_for_tile_priority, + new ChildFrame(frame.Pass(), viewport_rect_for_tile_priority.IsEmpty(), transform_for_tile_priority, offscreen_pre_raster_, parent_draw_constraints.is_layer)); diff --git a/android_webview/browser/browser_view_renderer_unittest.cc b/android_webview/browser/browser_view_renderer_unittest.cc index 39b83a9..9e2289c 100644 --- a/android_webview/browser/browser_view_renderer_unittest.cc +++ b/android_webview/browser/browser_view_renderer_unittest.cc @@ -57,7 +57,7 @@ class TestAnimateInAndOutOfScreen : public RenderingTest { void StartTest() override { new_constraints_ = ParentCompositorDrawConstraints( - false, gfx::Transform(), gfx::Rect(window_->surface_size())); + false, gfx::Transform(), window_->surface_size().IsEmpty()); new_constraints_.transform.Scale(2.0, 2.0); browser_view_renderer_->PostInvalidate(); } @@ -113,7 +113,7 @@ class TestAnimateInAndOutOfScreen : public RenderingTest { return false; return !constraints1.is_layer || - constraints1.surface_rect == constraints2.surface_rect; + constraints1.surface_rect_empty == constraints2.surface_rect_empty; } void ParentDrawConstraintsUpdated( diff --git a/android_webview/browser/child_frame.cc b/android_webview/browser/child_frame.cc index f516edc..8bb5de4 100644 --- a/android_webview/browser/child_frame.cc +++ b/android_webview/browser/child_frame.cc @@ -9,16 +9,16 @@ namespace android_webview { ChildFrame::ChildFrame(scoped_ptr<cc::CompositorFrame> frame, - const gfx::Rect& viewport_rect_for_tile_priority, + bool viewport_rect_for_tile_priority_empty, const gfx::Transform& transform_for_tile_priority, bool offscreen_pre_raster, bool is_layer) : frame(frame.Pass()), - viewport_rect_for_tile_priority(viewport_rect_for_tile_priority), + viewport_rect_for_tile_priority_empty( + viewport_rect_for_tile_priority_empty), transform_for_tile_priority(transform_for_tile_priority), offscreen_pre_raster(offscreen_pre_raster), - is_layer(is_layer) { -} + is_layer(is_layer) {} ChildFrame::~ChildFrame() { } diff --git a/android_webview/browser/child_frame.h b/android_webview/browser/child_frame.h index cb4f7d4..edcf6b4 100644 --- a/android_webview/browser/child_frame.h +++ b/android_webview/browser/child_frame.h @@ -19,14 +19,14 @@ namespace android_webview { class ChildFrame { public: ChildFrame(scoped_ptr<cc::CompositorFrame> frame, - const gfx::Rect& viewport_rect_for_tile_priority, + bool viewport_rect_for_tile_priority_empty, const gfx::Transform& transform_for_tile_priority, bool offscreen_pre_raster, bool is_layer); ~ChildFrame(); scoped_ptr<cc::CompositorFrame> frame; - const gfx::Rect viewport_rect_for_tile_priority; + const bool viewport_rect_for_tile_priority_empty; const gfx::Transform transform_for_tile_priority; const bool offscreen_pre_raster; const bool is_layer; diff --git a/android_webview/browser/hardware_renderer.cc b/android_webview/browser/hardware_renderer.cc index 224630d..8323ca4 100644 --- a/android_webview/browser/hardware_renderer.cc +++ b/android_webview/browser/hardware_renderer.cc @@ -129,7 +129,7 @@ void HardwareRenderer::DrawGL(bool stencil_enabled, // because there is no onDraw during a Render Thread animation, and child // compositor might not have the tiles rasterized as the animation goes on. ParentCompositorDrawConstraints draw_constraints( - draw_info->is_layer, transform, gfx::Rect(viewport)); + draw_info->is_layer, transform, viewport.IsEmpty()); if (!child_frame_.get() || draw_constraints.NeedUpdate(*child_frame_)) { shared_renderer_state_->PostExternalDrawConstraintsToChildCompositorOnRT( draw_constraints); diff --git a/android_webview/browser/parent_compositor_draw_constraints.cc b/android_webview/browser/parent_compositor_draw_constraints.cc index 8bd0ccd..7a82218 100644 --- a/android_webview/browser/parent_compositor_draw_constraints.cc +++ b/android_webview/browser/parent_compositor_draw_constraints.cc @@ -9,15 +9,16 @@ namespace android_webview { ParentCompositorDrawConstraints::ParentCompositorDrawConstraints() - : is_layer(false) { + : is_layer(false), surface_rect_empty(false) { } ParentCompositorDrawConstraints::ParentCompositorDrawConstraints( bool is_layer, const gfx::Transform& transform, - const gfx::Rect& surface_rect) - : is_layer(is_layer), transform(transform), surface_rect(surface_rect) { -} + bool surface_rect_empty) + : is_layer(is_layer), + transform(transform), + surface_rect_empty(surface_rect_empty) {} bool ParentCompositorDrawConstraints::NeedUpdate( const ChildFrame& frame) const { @@ -27,16 +28,11 @@ bool ParentCompositorDrawConstraints::NeedUpdate( } // Viewport for tile priority does not depend on surface rect in this case. - if (frame.offscreen_pre_raster) + if (frame.offscreen_pre_raster || is_layer) return false; - if (is_layer) { - return surface_rect != frame.viewport_rect_for_tile_priority; - } else { - // Workaround for corner case. See crbug.com/417479. - return frame.viewport_rect_for_tile_priority.IsEmpty() && - !surface_rect.IsEmpty(); - } + // Workaround for corner case. See crbug.com/417479. + return frame.viewport_rect_for_tile_priority_empty && !surface_rect_empty; } } // namespace webview diff --git a/android_webview/browser/parent_compositor_draw_constraints.h b/android_webview/browser/parent_compositor_draw_constraints.h index c8e535c..06eeb03 100644 --- a/android_webview/browser/parent_compositor_draw_constraints.h +++ b/android_webview/browser/parent_compositor_draw_constraints.h @@ -15,12 +15,12 @@ class ChildFrame; struct ParentCompositorDrawConstraints { bool is_layer; gfx::Transform transform; - gfx::Rect surface_rect; + bool surface_rect_empty; ParentCompositorDrawConstraints(); ParentCompositorDrawConstraints(bool is_layer, const gfx::Transform& transform, - const gfx::Rect& surface_rect); + bool surface_rect_empty); bool NeedUpdate(const ChildFrame& frame) const; }; |