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

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: unregister 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::TrimMemory(int level) {
joth 2013/10/02 10:47:01 not using level param? ideas: if level < 10 ret
boliu 2013/10/02 14:09:55 Not done yet. I'll have to play with this when I g
320 // Nothing to drop.
321 if (!attached_to_window_ || !hardware_initialized_ || !compositor_)
322 return;
323
324 // Do not release resources on view we expect to get DrawGL soon.
325 client_->UpdateGlobalVisibleRect();
326 if (view_visible_ && window_visible_ &&
327 !cached_global_visible_rect_.IsEmpty()) {
328 return;
329 }
330
331 if (!eglGetCurrentContext()) {
332 NOTREACHED();
333 return;
334 }
335
336 TRACE_EVENT0("android_webview", "InProcessViewRenderer::TrimMemory");
337 ScopedAppGLStateRestore state_restore(ScopedAppGLStateRestore::MODE_ON_TRIM);
338 gpu::InProcessCommandBuffer::ProcessGpuWorkOnCurrentThread();
339 ScopedAllowGL allow_gl;
340
341 // Just set the memory limit to 0 and drop all tiles. This will be reset to
342 // normal levels in the next DrawGL call.
343 content::SynchronousCompositorMemoryPolicy policy;
344 policy.bytes_limit = 0;
345 policy.num_resources_limit = 0;
346 compositor_->SetMemoryPolicy(policy);
347 ForceCompositeSW();
348 }
349
319 void InProcessViewRenderer::UpdateCachedGlobalVisibleRect() { 350 void InProcessViewRenderer::UpdateCachedGlobalVisibleRect() {
320 client_->UpdateGlobalVisibleRect(); 351 client_->UpdateGlobalVisibleRect();
321 } 352 }
322 353
323 bool InProcessViewRenderer::OnDraw(jobject java_canvas, 354 bool InProcessViewRenderer::OnDraw(jobject java_canvas,
324 bool is_hardware_canvas, 355 bool is_hardware_canvas,
325 const gfx::Vector2d& scroll, 356 const gfx::Vector2d& scroll,
326 const gfx::Rect& clip) { 357 const gfx::Rect& clip) {
327 scroll_at_start_of_frame_ = scroll; 358 scroll_at_start_of_frame_ = scroll;
328 if (is_hardware_canvas && attached_to_window_ && HardwareEnabled()) { 359 if (is_hardware_canvas && attached_to_window_ && HardwareEnabled()) {
329 // We should be performing a hardware draw here. If we don't have the 360 // 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 361 // 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. 362 // thus return false here to clear to background color for this draw.
332 return compositor_ && client_->RequestDrawGL(java_canvas); 363 return compositor_ && client_->RequestDrawGL(java_canvas);
333 } 364 }
334 // Perform a software draw 365 // Perform a software draw
335 return DrawSWInternal(java_canvas, clip); 366 return DrawSWInternal(java_canvas, clip);
336 } 367 }
337 368
338 bool InProcessViewRenderer::InitializeHwDraw() { 369 bool InProcessViewRenderer::InitializeHwDraw() {
339 TRACE_EVENT0("android_webview", "InitializeHwDraw"); 370 TRACE_EVENT0("android_webview", "InitializeHwDraw");
340 DCHECK(!gl_surface_); 371 DCHECK(!gl_surface_);
341 gl_surface_ = new AwGLSurface; 372 gl_surface_ = new AwGLSurface;
342 hardware_failed_ = !compositor_->InitializeHwDraw(gl_surface_); 373 hardware_failed_ = !compositor_->InitializeHwDraw(gl_surface_);
343 hardware_initialized_ = true; 374 hardware_initialized_ = true;
344 375
345 if (hardware_failed_) 376 if (hardware_failed_) {
346 gl_surface_ = NULL; 377 gl_surface_ = NULL;
378 }
joth 2013/10/02 10:47:01 intended change?
boliu 2013/10/02 14:09:55 Reverted.
347 379
348 return !hardware_failed_; 380 return !hardware_failed_;
349 } 381 }
350 382
351 void InProcessViewRenderer::DrawGL(AwDrawGLInfo* draw_info) { 383 void InProcessViewRenderer::DrawGL(AwDrawGLInfo* draw_info) {
352 TRACE_EVENT0("android_webview", "InProcessViewRenderer::DrawGL"); 384 TRACE_EVENT0("android_webview", "InProcessViewRenderer::DrawGL");
353 385
354 manager_key_ = g_view_renderer_manager.Get().DidDrawGL(manager_key_, this); 386 manager_key_ = g_view_renderer_manager.Get().DidDrawGL(manager_key_, this);
355 387
356 // We need to watch if the current Android context has changed and enforce 388 // We need to watch if the current Android context has changed and enforce
357 // a clean-up in the compositor. 389 // a clean-up in the compositor.
358 EGLContext current_context = eglGetCurrentContext(); 390 EGLContext current_context = eglGetCurrentContext();
359 if (!current_context) { 391 if (!current_context) {
360 TRACE_EVENT_INSTANT0( 392 TRACE_EVENT_INSTANT0(
361 "android_webview", "EarlyOut_NullEGLContext", TRACE_EVENT_SCOPE_THREAD); 393 "android_webview", "EarlyOut_NullEGLContext", TRACE_EVENT_SCOPE_THREAD);
362 return; 394 return;
363 } 395 }
364 396
365 ScopedAppGLStateRestore state_restore(ScopedAppGLStateRestore::MODE_DRAW); 397 ScopedAppGLStateRestore state_restore(ScopedAppGLStateRestore::MODE_DRAW);
366 gpu::InProcessCommandBuffer::ProcessGpuWorkOnCurrentThread(); 398 gpu::InProcessCommandBuffer::ProcessGpuWorkOnCurrentThread();
367 ScopedAllowGL allow_gl; 399 ScopedAllowGL allow_gl;
368 400
369 if (!attached_to_window_) { 401 if (!attached_to_window_) {
370 TRACE_EVENT_INSTANT0( 402 TRACE_EVENT_INSTANT0(
371 "android_webview", "EarlyOut_NotAttached", TRACE_EVENT_SCOPE_THREAD); 403 "android_webview", "EarlyOut_NotAttached", TRACE_EVENT_SCOPE_THREAD);
372 return; 404 return;
373 } 405 }
374 406
375 if (draw_info->mode == AwDrawGLInfo::kModeProcess) { 407 if (draw_info->mode == AwDrawGLInfo::kModeProcess) {
376 TRACE_EVENT_INSTANT0( 408 TRACE_EVENT0("android_webview", "EarlyOut_ModeProcess");
377 "android_webview", "EarlyOut_ModeProcess", TRACE_EVENT_SCOPE_THREAD);
378 return; 409 return;
379 } 410 }
380 411
381 if (compositor_ && !hardware_initialized_) { 412 if (compositor_ && !hardware_initialized_) {
382 if (InitializeHwDraw()) { 413 if (InitializeHwDraw()) {
383 last_egl_context_ = current_context; 414 last_egl_context_ = current_context;
384 } else { 415 } else {
385 TRACE_EVENT_INSTANT0( 416 TRACE_EVENT_INSTANT0(
386 "android_webview", "EarlyOut_HwInitFail", TRACE_EVENT_SCOPE_THREAD); 417 "android_webview", "EarlyOut_HwInitFail", TRACE_EVENT_SCOPE_THREAD);
387 LOG(ERROR) << "WebView hardware initialization failed"; 418 LOG(ERROR) << "WebView hardware initialization failed";
(...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after
862 893
863 void InProcessViewRenderer::FallbackTickFired() { 894 void InProcessViewRenderer::FallbackTickFired() {
864 TRACE_EVENT1("android_webview", 895 TRACE_EVENT1("android_webview",
865 "InProcessViewRenderer::FallbackTickFired", 896 "InProcessViewRenderer::FallbackTickFired",
866 "compositor_needs_continuous_invalidate_", 897 "compositor_needs_continuous_invalidate_",
867 compositor_needs_continuous_invalidate_); 898 compositor_needs_continuous_invalidate_);
868 899
869 // This should only be called if OnDraw or DrawGL did not come in time, which 900 // This should only be called if OnDraw or DrawGL did not come in time, which
870 // means block_invalidates_ must still be true. 901 // means block_invalidates_ must still be true.
871 DCHECK(block_invalidates_); 902 DCHECK(block_invalidates_);
872 if (compositor_needs_continuous_invalidate_ && compositor_) { 903 if (compositor_needs_continuous_invalidate_ && compositor_)
873 SkBitmapDevice device(SkBitmap::kARGB_8888_Config, 1, 1); 904 ForceCompositeSW();
874 SkCanvas canvas(&device); 905 }
875 CompositeSW(&canvas); 906
876 } 907 void InProcessViewRenderer::ForceCompositeSW() {
908 DCHECK(compositor_);
909 SkBitmapDevice device(SkBitmap::kARGB_8888_Config, 1, 1);
910 SkCanvas canvas(&device);
911 CompositeSW(&canvas);
877 } 912 }
878 913
879 bool InProcessViewRenderer::CompositeSW(SkCanvas* canvas) { 914 bool InProcessViewRenderer::CompositeSW(SkCanvas* canvas) {
880 DCHECK(compositor_); 915 DCHECK(compositor_);
881 916
882 fallback_tick_.Cancel(); 917 fallback_tick_.Cancel();
883 block_invalidates_ = true; 918 block_invalidates_ = true;
884 bool result = compositor_->DemandDrawSw(canvas); 919 bool result = compositor_->DemandDrawSw(canvas);
885 block_invalidates_ = false; 920 block_invalidates_ = false;
886 EnsureContinuousInvalidation(NULL, false); 921 EnsureContinuousInvalidation(NULL, false);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
925 base::StringAppendF(&str, 960 base::StringAppendF(&str,
926 "surface width height: [%d %d] ", 961 "surface width height: [%d %d] ",
927 draw_info->width, 962 draw_info->width,
928 draw_info->height); 963 draw_info->height);
929 base::StringAppendF(&str, "is_layer: %d ", draw_info->is_layer); 964 base::StringAppendF(&str, "is_layer: %d ", draw_info->is_layer);
930 } 965 }
931 return str; 966 return str;
932 } 967 }
933 968
934 } // namespace android_webview 969 } // 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