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) {
return client_->RequestDrawGL(wait_for_completion);
}
// This function updates the resource allocation in GlobalTileManager.
void BrowserViewRenderer::TrimMemory(const int level, const bool visible) {
DCHECK(ui_task_runner_->BelongsToCurrentThread());
// Constants from Android ComponentCallbacks2.
......@@ -145,32 +144,44 @@ void BrowserViewRenderer::TrimMemory(const int level, const bool visible) {
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) {
shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI();
if (offscreen_pre_raster_)
shared_renderer_state_.DeleteHardwareRendererOnUI();
else
shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI();
return;
}
// Just set the memory limit to 0 and drop all tiles. This will be reset to
// normal levels in the next DrawGL call.
compositor_->SetMemoryPolicy(0u);
ForceFakeCompositeSW();
if (!offscreen_pre_raster_)
compositor_->SetMemoryPolicy(0u);
}
size_t BrowserViewRenderer::CalculateDesiredMemoryPolicy() {
if (g_memory_override_in_bytes)
return static_cast<size_t>(g_memory_override_in_bytes);
void BrowserViewRenderer::UpdateMemoryPolicy() {
if (!hardware_enabled_) {
compositor_->SetMemoryPolicy(0u);
return;
}
gfx::Rect interest_rect = offscreen_pre_raster_
? gfx::Rect(size_)
: last_on_draw_global_visible_rect_;
size_t width = interest_rect.width();
size_t height = interest_rect.height();
size_t bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height;
// Round up to a multiple of kMemoryAllocationStep.
bytes_limit =
(bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep;
return bytes_limit;
size_t bytes_limit = 0u;
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_;
size_t width = interest_rect.width();
size_t height = interest_rect.height();
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,
......@@ -213,7 +224,7 @@ bool BrowserViewRenderer::CompositeHw() {
CancelFallbackTick();
ReturnResourceFromParent();
compositor_->SetMemoryPolicy(CalculateDesiredMemoryPolicy());
UpdateMemoryPolicy();
ParentCompositorDrawConstraints parent_draw_constraints =
shared_renderer_state_.GetParentDrawConstraintsOnUI();
......@@ -337,7 +348,9 @@ void BrowserViewRenderer::ClearView() {
}
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;
}
......
......@@ -146,7 +146,7 @@ class BrowserViewRenderer : public content::SynchronousCompositorClient {
gfx::Vector2d max_scroll_offset() const;
size_t CalculateDesiredMemoryPolicy();
void UpdateMemoryPolicy();
// For debug tracing or logging. Return the string representation of this
// view renderer's state.
......
......@@ -285,11 +285,22 @@ void SharedRendererState::DrawGL(AwDrawGLInfo* draw_info) {
}
void SharedRendererState::ReleaseHardwareDrawIfNeededOnUI() {
ReleaseCompositorResourcesIfNeededOnUI(true);
}
void SharedRendererState::DeleteHardwareRendererOnUI() {
ReleaseCompositorResourcesIfNeededOnUI(false);
}
void SharedRendererState::ReleaseCompositorResourcesIfNeededOnUI(
bool release_hardware_draw) {
DCHECK(ui_loop_->BelongsToCurrentThread());
InsideHardwareReleaseReset auto_inside_hardware_release_reset(this);
browser_view_renderer_->DetachFunctorFromView();
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) {
bool draw_functor_succeeded = browser_view_renderer_->RequestDrawGL(true);
if (!draw_functor_succeeded) {
......@@ -300,7 +311,8 @@ void SharedRendererState::ReleaseHardwareDrawIfNeededOnUI() {
DrawGL(&info);
}
browser_view_renderer_->ReleaseHardware();
if (release_hardware_draw)
browser_view_renderer_->ReleaseHardware();
}
GLViewRendererManager* manager = GLViewRendererManager::GetInstance();
......
......@@ -48,6 +48,7 @@ class SharedRendererState {
void SwapReturnedResourcesOnUI(cc::ReturnedResourceArray* resources);
bool ReturnedResourcesEmptyOnUI() const;
scoped_ptr<ChildFrame> PassUncommittedFrameOnUI();
void DeleteHardwareRendererOnUI();
// RT thread methods.
gfx::Vector2d GetScrollOffsetOnRT();
......@@ -78,6 +79,7 @@ class SharedRendererState {
void UpdateParentDrawConstraintsOnUI();
bool IsInsideHardwareRelease() const;
void SetInsideHardwareRelease(bool inside);
void ReleaseCompositorResourcesIfNeededOnUI(bool release_hardware_draw);
// Accessed by UI thread.
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