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

Side by Side Diff: android_webview/browser/in_process_view_renderer.cc

Issue 25082006: [Android WebView] OnMemoryPressure to drop tile memory (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: per view callback Created 7 years, 2 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "android_webview/browser/in_process_view_renderer.h" 5 #include "android_webview/browser/in_process_view_renderer.h"
6 6
7 #include <android/bitmap.h> 7 #include <android/bitmap.h>
8 8
9 #include "android_webview/browser/aw_gl_surface.h" 9 #include "android_webview/browser/aw_gl_surface.h"
10 #include "android_webview/browser/scoped_app_gl_state_restore.h" 10 #include "android_webview/browser/scoped_app_gl_state_restore.h"
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 std::stringstream size; 309 std::stringstream size;
310 size << default_tile_size; 310 size << default_tile_size;
311 cl->AppendSwitchASCII(switches::kDefaultTileWidth, size.str()); 311 cl->AppendSwitchASCII(switches::kDefaultTileWidth, size.str());
312 cl->AppendSwitchASCII(switches::kDefaultTileHeight, size.str()); 312 cl->AppendSwitchASCII(switches::kDefaultTileHeight, size.str());
313 } 313 }
314 314
315 bool InProcessViewRenderer::RequestProcessGL() { 315 bool InProcessViewRenderer::RequestProcessGL() {
316 return client_->RequestDrawGL(NULL); 316 return client_->RequestDrawGL(NULL);
317 } 317 }
318 318
319 void InProcessViewRenderer::OnMemoryPressure(
320 base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level) {
321 // Nothing to release.
322 if (!attached_to_window_ || !compositor_ || !hardware_initialized_)
323 return;
324
325 // Do not release resources on view we expect to get DrawGL soon.
326 client_->UpdateGlobalVisibleRect();
327 if (view_visible_ && window_visible_ &&
328 !cached_global_visible_rect_.IsEmpty()) {
329 return;
330 }
331
332 // Check that the expected EGL context is current. This may not be the case if
333 // the OnMemoryPressure callback is triggered manually in Chromium code.
334 DCHECK(last_egl_context_);
335 if (eglGetCurrentContext() != last_egl_context_)
boliu 2013/10/01 20:10:48 This check is failing, so as is, this patch does n
336 return;
337
338 TRACE_EVENT0("android_webview", "OnMemoryPressure");
339 ScopedAppGLStateRestore state_restore(ScopedAppGLStateRestore::MODE_ON_TRIM);
340 gpu::InProcessCommandBuffer::ProcessGpuWorkOnCurrentThread();
341 ScopedAllowGL allow_gl;
342
343 // Just set the memory limit to 0 and drop all tiles. This will be reset to
344 // normal levels in the next DrawGL call.
345 content::SynchronousCompositorMemoryPolicy policy;
346 policy.bytes_limit = 0;
347 policy.num_resources_limit = 0;
348 compositor_->SetMemoryPolicy(policy);
349 }
350
319 void InProcessViewRenderer::UpdateCachedGlobalVisibleRect() { 351 void InProcessViewRenderer::UpdateCachedGlobalVisibleRect() {
320 client_->UpdateGlobalVisibleRect(); 352 client_->UpdateGlobalVisibleRect();
321 } 353 }
322 354
323 bool InProcessViewRenderer::OnDraw(jobject java_canvas, 355 bool InProcessViewRenderer::OnDraw(jobject java_canvas,
324 bool is_hardware_canvas, 356 bool is_hardware_canvas,
325 const gfx::Vector2d& scroll, 357 const gfx::Vector2d& scroll,
326 const gfx::Rect& clip) { 358 const gfx::Rect& clip) {
327 scroll_at_start_of_frame_ = scroll; 359 scroll_at_start_of_frame_ = scroll;
328 if (is_hardware_canvas && attached_to_window_ && HardwareEnabled()) { 360 if (is_hardware_canvas && attached_to_window_ && HardwareEnabled()) {
329 // We should be performing a hardware draw here. If we don't have the 361 // We should be performing a hardware draw here. If we don't have the
330 // comositor yet or if RequestDrawGL fails, it means we failed this draw and 362 // comositor yet or if RequestDrawGL fails, it means we failed this draw and
331 // thus return false here to clear to background color for this draw. 363 // thus return false here to clear to background color for this draw.
332 return compositor_ && client_->RequestDrawGL(java_canvas); 364 return compositor_ && client_->RequestDrawGL(java_canvas);
333 } 365 }
334 // Perform a software draw 366 // Perform a software draw
335 return DrawSWInternal(java_canvas, clip); 367 return DrawSWInternal(java_canvas, clip);
336 } 368 }
337 369
338 bool InProcessViewRenderer::InitializeHwDraw() { 370 bool InProcessViewRenderer::InitializeHwDraw() {
339 TRACE_EVENT0("android_webview", "InitializeHwDraw"); 371 TRACE_EVENT0("android_webview", "InitializeHwDraw");
340 DCHECK(!gl_surface_); 372 DCHECK(!gl_surface_);
341 gl_surface_ = new AwGLSurface; 373 gl_surface_ = new AwGLSurface;
342 hardware_failed_ = !compositor_->InitializeHwDraw(gl_surface_); 374 hardware_failed_ = !compositor_->InitializeHwDraw(gl_surface_);
343 hardware_initialized_ = true; 375 hardware_initialized_ = true;
344 376
345 if (hardware_failed_) 377 if (hardware_failed_) {
346 gl_surface_ = NULL; 378 gl_surface_ = NULL;
379 } else {
380 memory_pressure_listener_.reset(new base::MemoryPressureListener(
381 base::Bind(&InProcessViewRenderer::OnMemoryPressure,
382 base::Unretained(this))));
383 }
347 384
348 return !hardware_failed_; 385 return !hardware_failed_;
349 } 386 }
350 387
351 void InProcessViewRenderer::DrawGL(AwDrawGLInfo* draw_info) { 388 void InProcessViewRenderer::DrawGL(AwDrawGLInfo* draw_info) {
352 TRACE_EVENT0("android_webview", "InProcessViewRenderer::DrawGL"); 389 TRACE_EVENT0("android_webview", "InProcessViewRenderer::DrawGL");
353 390
354 manager_key_ = g_view_renderer_manager.Get().DidDrawGL(manager_key_, this); 391 manager_key_ = g_view_renderer_manager.Get().DidDrawGL(manager_key_, this);
355 392
356 // We need to watch if the current Android context has changed and enforce 393 // We need to watch if the current Android context has changed and enforce
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
636 NoLongerExpectsDrawGL(); 673 NoLongerExpectsDrawGL();
637 if (hardware_initialized_) { 674 if (hardware_initialized_) {
638 DCHECK(compositor_); 675 DCHECK(compositor_);
639 676
640 ScopedAppGLStateRestore state_restore( 677 ScopedAppGLStateRestore state_restore(
641 ScopedAppGLStateRestore::MODE_DETACH_FROM_WINDOW); 678 ScopedAppGLStateRestore::MODE_DETACH_FROM_WINDOW);
642 gpu::InProcessCommandBuffer::ProcessGpuWorkOnCurrentThread(); 679 gpu::InProcessCommandBuffer::ProcessGpuWorkOnCurrentThread();
643 ScopedAllowGL allow_gl; 680 ScopedAllowGL allow_gl;
644 compositor_->ReleaseHwDraw(); 681 compositor_->ReleaseHwDraw();
645 hardware_initialized_ = false; 682 hardware_initialized_ = false;
683 memory_pressure_listener_.reset();
646 } 684 }
647 685
648 gl_surface_ = NULL; 686 gl_surface_ = NULL;
649 attached_to_window_ = false; 687 attached_to_window_ = false;
650 } 688 }
651 689
652 bool InProcessViewRenderer::IsAttachedToWindow() { 690 bool InProcessViewRenderer::IsAttachedToWindow() {
653 return attached_to_window_; 691 return attached_to_window_;
654 } 692 }
655 693
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
925 base::StringAppendF(&str, 963 base::StringAppendF(&str,
926 "surface width height: [%d %d] ", 964 "surface width height: [%d %d] ",
927 draw_info->width, 965 draw_info->width,
928 draw_info->height); 966 draw_info->height);
929 base::StringAppendF(&str, "is_layer: %d ", draw_info->is_layer); 967 base::StringAppendF(&str, "is_layer: %d ", draw_info->is_layer);
930 } 968 }
931 return str; 969 return str;
932 } 970 }
933 971
934 } // namespace android_webview 972 } // namespace android_webview
OLDNEW
« no previous file with comments | « android_webview/browser/in_process_view_renderer.h ('k') | android_webview/browser/scoped_app_gl_state_restore.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698