Commit 6ef62050 authored by hush's avatar hush Committed by Commit bot

TrimMemory strategy while offscreenPreRaster is on.

BUG=460638

Review URL: https://codereview.chromium.org/1082393003

Cr-Commit-Position: refs/heads/master@{#325394}
parent 31dc7d11
...@@ -118,7 +118,6 @@ bool BrowserViewRenderer::RequestDrawGL(bool wait_for_completion) { ...@@ -118,7 +118,6 @@ bool BrowserViewRenderer::RequestDrawGL(bool wait_for_completion) {
return client_->RequestDrawGL(wait_for_completion); return client_->RequestDrawGL(wait_for_completion);
} }
// This function updates the resource allocation in GlobalTileManager.
void BrowserViewRenderer::TrimMemory(const int level, const bool visible) { void BrowserViewRenderer::TrimMemory(const int level, const bool visible) {
DCHECK(ui_task_runner_->BelongsToCurrentThread()); DCHECK(ui_task_runner_->BelongsToCurrentThread());
// Constants from Android ComponentCallbacks2. // Constants from Android ComponentCallbacks2.
...@@ -145,32 +144,44 @@ void BrowserViewRenderer::TrimMemory(const int level, const bool visible) { ...@@ -145,32 +144,44 @@ void BrowserViewRenderer::TrimMemory(const int level, const bool visible) {
TRACE_EVENT0("android_webview", "BrowserViewRenderer::TrimMemory"); TRACE_EVENT0("android_webview", "BrowserViewRenderer::TrimMemory");
// Drop everything in hardware. // If offscreen pre-raster is disabled, drop everything in hardware. Otherwise
// keep the tiles and just delete the HardwareRenderer.
if (level >= TRIM_MEMORY_MODERATE) { if (level >= TRIM_MEMORY_MODERATE) {
shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); if (offscreen_pre_raster_)
shared_renderer_state_.DeleteHardwareRendererOnUI();
else
shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI();
return; return;
} }
// Just set the memory limit to 0 and drop all tiles. This will be reset to // Just set the memory limit to 0 and drop all tiles. This will be reset to
// normal levels in the next DrawGL call. // normal levels in the next DrawGL call.
compositor_->SetMemoryPolicy(0u); if (!offscreen_pre_raster_)
ForceFakeCompositeSW(); compositor_->SetMemoryPolicy(0u);
} }
size_t BrowserViewRenderer::CalculateDesiredMemoryPolicy() { void BrowserViewRenderer::UpdateMemoryPolicy() {
if (g_memory_override_in_bytes) if (!hardware_enabled_) {
return static_cast<size_t>(g_memory_override_in_bytes); compositor_->SetMemoryPolicy(0u);
return;
}
gfx::Rect interest_rect = offscreen_pre_raster_ size_t bytes_limit = 0u;
? gfx::Rect(size_) if (g_memory_override_in_bytes) {
: last_on_draw_global_visible_rect_; bytes_limit = static_cast<size_t>(g_memory_override_in_bytes);
size_t width = interest_rect.width(); } else {
size_t height = interest_rect.height(); gfx::Rect interest_rect = offscreen_pre_raster_
size_t bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; ? gfx::Rect(size_)
// Round up to a multiple of kMemoryAllocationStep. : last_on_draw_global_visible_rect_;
bytes_limit = size_t width = interest_rect.width();
(bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep; size_t height = interest_rect.height();
return bytes_limit; bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height;
// Round up to a multiple of kMemoryAllocationStep.
bytes_limit =
(bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep;
}
compositor_->SetMemoryPolicy(bytes_limit);
} }
void BrowserViewRenderer::PrepareToDraw(const gfx::Vector2d& scroll, void BrowserViewRenderer::PrepareToDraw(const gfx::Vector2d& scroll,
...@@ -213,7 +224,7 @@ bool BrowserViewRenderer::CompositeHw() { ...@@ -213,7 +224,7 @@ bool BrowserViewRenderer::CompositeHw() {
CancelFallbackTick(); CancelFallbackTick();
ReturnResourceFromParent(); ReturnResourceFromParent();
compositor_->SetMemoryPolicy(CalculateDesiredMemoryPolicy()); UpdateMemoryPolicy();
ParentCompositorDrawConstraints parent_draw_constraints = ParentCompositorDrawConstraints parent_draw_constraints =
shared_renderer_state_.GetParentDrawConstraintsOnUI(); shared_renderer_state_.GetParentDrawConstraintsOnUI();
...@@ -337,7 +348,9 @@ void BrowserViewRenderer::ClearView() { ...@@ -337,7 +348,9 @@ void BrowserViewRenderer::ClearView() {
} }
void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) {
// TODO(hush): anything to do when the setting is toggled? if (offscreen_pre_raster_ != enable && compositor_)
UpdateMemoryPolicy();
offscreen_pre_raster_ = enable; offscreen_pre_raster_ = enable;
} }
......
...@@ -146,7 +146,7 @@ class BrowserViewRenderer : public content::SynchronousCompositorClient { ...@@ -146,7 +146,7 @@ class BrowserViewRenderer : public content::SynchronousCompositorClient {
gfx::Vector2d max_scroll_offset() const; gfx::Vector2d max_scroll_offset() const;
size_t CalculateDesiredMemoryPolicy(); void UpdateMemoryPolicy();
// For debug tracing or logging. Return the string representation of this // For debug tracing or logging. Return the string representation of this
// view renderer's state. // view renderer's state.
......
...@@ -285,11 +285,22 @@ void SharedRendererState::DrawGL(AwDrawGLInfo* draw_info) { ...@@ -285,11 +285,22 @@ void SharedRendererState::DrawGL(AwDrawGLInfo* draw_info) {
} }
void SharedRendererState::ReleaseHardwareDrawIfNeededOnUI() { void SharedRendererState::ReleaseHardwareDrawIfNeededOnUI() {
ReleaseCompositorResourcesIfNeededOnUI(true);
}
void SharedRendererState::DeleteHardwareRendererOnUI() {
ReleaseCompositorResourcesIfNeededOnUI(false);
}
void SharedRendererState::ReleaseCompositorResourcesIfNeededOnUI(
bool release_hardware_draw) {
DCHECK(ui_loop_->BelongsToCurrentThread()); DCHECK(ui_loop_->BelongsToCurrentThread());
InsideHardwareReleaseReset auto_inside_hardware_release_reset(this); InsideHardwareReleaseReset auto_inside_hardware_release_reset(this);
browser_view_renderer_->DetachFunctorFromView(); browser_view_renderer_->DetachFunctorFromView();
bool hardware_initialized = browser_view_renderer_->hardware_enabled(); bool hardware_initialized = browser_view_renderer_->hardware_enabled();
// If the WebView gets onTrimMemory >= MODERATE twice in a row, the 2nd
// onTrimMemory will result in an unnecessary Render Thread DrawGL call.
if (hardware_initialized) { if (hardware_initialized) {
bool draw_functor_succeeded = browser_view_renderer_->RequestDrawGL(true); bool draw_functor_succeeded = browser_view_renderer_->RequestDrawGL(true);
if (!draw_functor_succeeded) { if (!draw_functor_succeeded) {
...@@ -300,7 +311,8 @@ void SharedRendererState::ReleaseHardwareDrawIfNeededOnUI() { ...@@ -300,7 +311,8 @@ void SharedRendererState::ReleaseHardwareDrawIfNeededOnUI() {
DrawGL(&info); DrawGL(&info);
} }
browser_view_renderer_->ReleaseHardware(); if (release_hardware_draw)
browser_view_renderer_->ReleaseHardware();
} }
GLViewRendererManager* manager = GLViewRendererManager::GetInstance(); GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
......
...@@ -48,6 +48,7 @@ class SharedRendererState { ...@@ -48,6 +48,7 @@ class SharedRendererState {
void SwapReturnedResourcesOnUI(cc::ReturnedResourceArray* resources); void SwapReturnedResourcesOnUI(cc::ReturnedResourceArray* resources);
bool ReturnedResourcesEmptyOnUI() const; bool ReturnedResourcesEmptyOnUI() const;
scoped_ptr<ChildFrame> PassUncommittedFrameOnUI(); scoped_ptr<ChildFrame> PassUncommittedFrameOnUI();
void DeleteHardwareRendererOnUI();
// RT thread methods. // RT thread methods.
gfx::Vector2d GetScrollOffsetOnRT(); gfx::Vector2d GetScrollOffsetOnRT();
...@@ -78,6 +79,7 @@ class SharedRendererState { ...@@ -78,6 +79,7 @@ class SharedRendererState {
void UpdateParentDrawConstraintsOnUI(); void UpdateParentDrawConstraintsOnUI();
bool IsInsideHardwareRelease() const; bool IsInsideHardwareRelease() const;
void SetInsideHardwareRelease(bool inside); void SetInsideHardwareRelease(bool inside);
void ReleaseCompositorResourcesIfNeededOnUI(bool release_hardware_draw);
// Accessed by UI thread. // Accessed by UI thread.
scoped_refptr<base::SingleThreadTaskRunner> ui_loop_; scoped_refptr<base::SingleThreadTaskRunner> ui_loop_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment