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

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

Issue 1816283005: Move SharedRendererState ownership to AwContents (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: All tests passing Created 4 years, 8 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/browser_view_renderer.h" 5 #include "android_webview/browser/browser_view_renderer.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "android_webview/browser/browser_view_renderer_client.h" 9 #include "android_webview/browser/browser_view_renderer_client.h"
10 #include "android_webview/browser/child_frame.h" 10 #include "android_webview/browser/child_frame.h"
11 #include "base/auto_reset.h" 11 #include "base/auto_reset.h"
12 #include "base/command_line.h" 12 #include "base/command_line.h"
13 #include "base/logging.h" 13 #include "base/logging.h"
14 #include "base/strings/string_number_conversions.h" 14 #include "base/strings/string_number_conversions.h"
15 #include "base/strings/stringprintf.h" 15 #include "base/strings/stringprintf.h"
16 #include "base/supports_user_data.h" 16 #include "base/supports_user_data.h"
17 #include "base/trace_event/trace_event_argument.h" 17 #include "base/trace_event/trace_event_argument.h"
18 #include "cc/output/compositor_frame.h" 18 #include "cc/output/compositor_frame.h"
19 #include "cc/output/compositor_frame_ack.h"
19 #include "content/public/browser/web_contents.h" 20 #include "content/public/browser/web_contents.h"
20 #include "content/public/common/content_switches.h" 21 #include "content/public/common/content_switches.h"
21 #include "gpu/command_buffer/service/gpu_switches.h" 22 #include "gpu/command_buffer/service/gpu_switches.h"
22 #include "third_party/skia/include/core/SkBitmap.h" 23 #include "third_party/skia/include/core/SkBitmap.h"
23 #include "third_party/skia/include/core/SkCanvas.h" 24 #include "third_party/skia/include/core/SkCanvas.h"
24 #include "third_party/skia/include/core/SkPicture.h" 25 #include "third_party/skia/include/core/SkPicture.h"
25 #include "third_party/skia/include/core/SkPictureRecorder.h" 26 #include "third_party/skia/include/core/SkPictureRecorder.h"
26 #include "ui/gfx/geometry/scroll_offset.h" 27 #include "ui/gfx/geometry/scroll_offset.h"
27 #include "ui/gfx/geometry/vector2d_conversions.h" 28 #include "ui/gfx/geometry/vector2d_conversions.h"
28 29
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 BrowserViewRenderer* BrowserViewRenderer::FromWebContents( 82 BrowserViewRenderer* BrowserViewRenderer::FromWebContents(
82 content::WebContents* web_contents) { 83 content::WebContents* web_contents) {
83 return BrowserViewRendererUserData::GetBrowserViewRenderer(web_contents); 84 return BrowserViewRendererUserData::GetBrowserViewRenderer(web_contents);
84 } 85 }
85 86
86 BrowserViewRenderer::BrowserViewRenderer( 87 BrowserViewRenderer::BrowserViewRenderer(
87 BrowserViewRendererClient* client, 88 BrowserViewRendererClient* client,
88 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner, 89 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner,
89 bool disable_page_visibility) 90 bool disable_page_visibility)
90 : client_(client), 91 : client_(client),
91 shared_renderer_state_(ui_task_runner, this),
92 ui_task_runner_(ui_task_runner), 92 ui_task_runner_(ui_task_runner),
93 shared_renderer_state_(nullptr),
93 disable_page_visibility_(disable_page_visibility), 94 disable_page_visibility_(disable_page_visibility),
94 compositor_(NULL), 95 compositor_(NULL),
95 is_paused_(false), 96 is_paused_(false),
96 view_visible_(false), 97 view_visible_(false),
97 window_visible_(false), 98 window_visible_(false),
98 attached_to_window_(false), 99 attached_to_window_(false),
99 hardware_enabled_(false), 100 hardware_enabled_(false),
100 dip_scale_(0.f), 101 dip_scale_(0.f),
101 page_scale_factor_(1.f), 102 page_scale_factor_(1.f),
102 min_page_scale_factor_(0.f), 103 min_page_scale_factor_(0.f),
103 max_page_scale_factor_(0.f), 104 max_page_scale_factor_(0.f),
104 on_new_picture_enable_(false), 105 on_new_picture_enable_(false),
105 clear_view_(false), 106 clear_view_(false),
106 offscreen_pre_raster_(false), 107 offscreen_pre_raster_(false),
107 next_compositor_id_(1) {} 108 next_compositor_id_(1) {}
108 109
109 BrowserViewRenderer::~BrowserViewRenderer() { 110 BrowserViewRenderer::~BrowserViewRenderer() {
110 DCHECK(compositor_map_.empty()); 111 DCHECK(compositor_map_.empty());
111 } 112 }
112 113
114 void BrowserViewRenderer::SetSharedRendererState(
115 SharedRendererState* shared_renderer_state) {
116 shared_renderer_state_ = shared_renderer_state;
117 }
118
113 void BrowserViewRenderer::RegisterWithWebContents( 119 void BrowserViewRenderer::RegisterWithWebContents(
114 content::WebContents* web_contents) { 120 content::WebContents* web_contents) {
115 web_contents->SetUserData(kBrowserViewRendererUserDataKey, 121 web_contents->SetUserData(kBrowserViewRendererUserDataKey,
116 new BrowserViewRendererUserData(this)); 122 new BrowserViewRendererUserData(this));
117 } 123 }
118 124
119 SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() { 125 void BrowserViewRenderer::TrimMemory() {
120 return &shared_renderer_state_;
121 }
122
123 bool BrowserViewRenderer::RequestDrawGL(bool wait_for_completion) {
124 return client_->RequestDrawGL(wait_for_completion);
125 }
126
127 void BrowserViewRenderer::TrimMemory(const int level, const bool visible) {
128 DCHECK(ui_task_runner_->BelongsToCurrentThread()); 126 DCHECK(ui_task_runner_->BelongsToCurrentThread());
129 // Constants from Android ComponentCallbacks2.
130 enum {
131 TRIM_MEMORY_RUNNING_LOW = 10,
132 TRIM_MEMORY_UI_HIDDEN = 20,
133 TRIM_MEMORY_BACKGROUND = 40,
134 TRIM_MEMORY_MODERATE = 60,
135 };
136
137 // Not urgent enough. TRIM_MEMORY_UI_HIDDEN is treated specially because
138 // it does not indicate memory pressure, but merely that the app is
139 // backgrounded.
140 if (level < TRIM_MEMORY_RUNNING_LOW || level == TRIM_MEMORY_UI_HIDDEN)
141 return;
142
143 // Do not release resources on view we expect to get DrawGL soon.
144 if (level < TRIM_MEMORY_BACKGROUND && visible)
145 return;
146
147 // Nothing to drop. 127 // Nothing to drop.
148 if (!compositor_ || !hardware_enabled_) 128 if (!compositor_ || !hardware_enabled_)
149 return; 129 return;
150 130
151 TRACE_EVENT0("android_webview", "BrowserViewRenderer::TrimMemory"); 131 TRACE_EVENT0("android_webview", "BrowserViewRenderer::TrimMemory");
152 132
153 // If offscreen pre-raster is disabled, drop everything in hardware. Otherwise
154 // keep the tiles and just delete the HardwareRenderer.
155 if (level >= TRIM_MEMORY_MODERATE) {
156 if (offscreen_pre_raster_)
157 shared_renderer_state_.DeleteHardwareRendererOnUI();
158 else
159 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI();
160 return;
161 }
162
163 // Just set the memory limit to 0 and drop all tiles. This will be reset to 133 // Just set the memory limit to 0 and drop all tiles. This will be reset to
164 // normal levels in the next DrawGL call. 134 // normal levels in the next DrawGL call.
165 // TODO(hush): need to setMemoryPolicy to 0 for non-current compositors too. 135 // TODO(hush): need to setMemoryPolicy to 0 for non-current compositors too.
166 // But WebView only has non-current compositors temporarily. So don't have to 136 // But WebView only has non-current compositors temporarily. So don't have to
167 // do it now. 137 // do it now.
168 if (!offscreen_pre_raster_) 138 if (!offscreen_pre_raster_)
169 compositor_->SetMemoryPolicy(0u); 139 compositor_->SetMemoryPolicy(0u);
170 } 140 }
171 141
172 void BrowserViewRenderer::UpdateMemoryPolicy() { 142 void BrowserViewRenderer::UpdateMemoryPolicy() {
143 if (!compositor_) {
144 return;
145 }
146
173 if (!hardware_enabled_) { 147 if (!hardware_enabled_) {
174 compositor_->SetMemoryPolicy(0u); 148 compositor_->SetMemoryPolicy(0u);
175 return; 149 return;
176 } 150 }
177 151
178 size_t bytes_limit = 0u; 152 size_t bytes_limit = 0u;
179 if (g_memory_override_in_bytes) { 153 if (g_memory_override_in_bytes) {
180 bytes_limit = static_cast<size_t>(g_memory_override_in_bytes); 154 bytes_limit = static_cast<size_t>(g_memory_override_in_bytes);
181 } else { 155 } else {
182 ParentCompositorDrawConstraints parent_draw_constraints =
183 shared_renderer_state_.GetParentDrawConstraintsOnUI();
184 gfx::Rect interest_rect = 156 gfx::Rect interest_rect =
185 offscreen_pre_raster_ || parent_draw_constraints.is_layer 157 offscreen_pre_raster_ || external_draw_constraints_.is_layer
186 ? gfx::Rect(size_) 158 ? gfx::Rect(size_)
187 : last_on_draw_global_visible_rect_; 159 : last_on_draw_global_visible_rect_;
188 size_t width = interest_rect.width(); 160 size_t width = interest_rect.width();
189 size_t height = interest_rect.height(); 161 size_t height = interest_rect.height();
190 bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; 162 bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height;
191 // Round up to a multiple of kMemoryAllocationStep. 163 // Round up to a multiple of kMemoryAllocationStep.
192 bytes_limit = 164 bytes_limit =
193 (bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep; 165 (bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep;
194 } 166 }
195 167
(...skipping 15 matching lines...) Expand all
211 if (clear_view_) { 183 if (clear_view_) {
212 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_ClearView", 184 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_ClearView",
213 TRACE_EVENT_SCOPE_THREAD); 185 TRACE_EVENT_SCOPE_THREAD);
214 return false; 186 return false;
215 } 187 }
216 188
217 return true; 189 return true;
218 } 190 }
219 191
220 bool BrowserViewRenderer::OnDrawHardware() { 192 bool BrowserViewRenderer::OnDrawHardware() {
193 DCHECK(shared_renderer_state_);
boliu 2016/03/30 16:12:13 Maybe leave a comment that client is responsible f
Tobias Sargeant 2016/03/30 17:17:16 Done.
221 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware"); 194 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware");
222 195
223 shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI(); 196 shared_renderer_state_->InitializeHardwareDrawIfNeededOnUI();
224 197
225 if (!CanOnDraw()) { 198 if (!CanOnDraw()) {
226 return false; 199 return false;
227 } 200 }
228 201
229 shared_renderer_state_.SetScrollOffsetOnUI(last_on_draw_scroll_offset_); 202 shared_renderer_state_->SetScrollOffsetOnUI(last_on_draw_scroll_offset_);
230 hardware_enabled_ = true; 203 hardware_enabled_ = true;
231 204
205 external_draw_constraints_ =
206 shared_renderer_state_->GetParentDrawConstraintsOnUI();
207
232 ReturnResourceFromParent(); 208 ReturnResourceFromParent();
233 UpdateMemoryPolicy(); 209 UpdateMemoryPolicy();
234 210
235 ParentCompositorDrawConstraints parent_draw_constraints =
236 shared_renderer_state_.GetParentDrawConstraintsOnUI();
237 gfx::Size surface_size(size_); 211 gfx::Size surface_size(size_);
238 gfx::Rect viewport(surface_size); 212 gfx::Rect viewport(surface_size);
239 gfx::Rect clip = viewport; 213 gfx::Rect clip = viewport;
240 gfx::Transform transform_for_tile_priority = 214 gfx::Transform transform_for_tile_priority =
241 parent_draw_constraints.transform; 215 external_draw_constraints_.transform;
242 216
243 // If the WebView is on a layer, WebView does not know what transform is 217 // If the WebView is on a layer, WebView does not know what transform is
244 // applied onto the layer so global visible rect does not make sense here. 218 // applied onto the layer so global visible rect does not make sense here.
245 // In this case, just use the surface rect for tiling. 219 // In this case, just use the surface rect for tiling.
246 gfx::Rect viewport_rect_for_tile_priority; 220 gfx::Rect viewport_rect_for_tile_priority;
247 221
248 // Leave viewport_rect_for_tile_priority empty if offscreen_pre_raster_ is on. 222 // Leave viewport_rect_for_tile_priority empty if offscreen_pre_raster_ is on.
249 if (!offscreen_pre_raster_ && !parent_draw_constraints.is_layer) { 223 if (!offscreen_pre_raster_ && !external_draw_constraints_.is_layer) {
250 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; 224 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_;
251 } 225 }
252 226
253 content::SynchronousCompositor::Frame frame = 227 content::SynchronousCompositor::Frame frame =
254 compositor_->DemandDrawHw(surface_size, 228 compositor_->DemandDrawHw(surface_size,
255 gfx::Transform(), 229 gfx::Transform(),
256 viewport, 230 viewport,
257 clip, 231 clip,
258 viewport_rect_for_tile_priority, 232 viewport_rect_for_tile_priority,
259 transform_for_tile_priority); 233 transform_for_tile_priority);
260 if (!frame.frame.get()) { 234 if (!frame.frame.get()) {
261 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", 235 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame",
262 TRACE_EVENT_SCOPE_THREAD); 236 TRACE_EVENT_SCOPE_THREAD);
263 hardware_enabled_ = shared_renderer_state_.HasFrameOnUI(); 237 hardware_enabled_ = shared_renderer_state_->HasFrameOnUI();
264 if (!hardware_enabled_) 238 if (!hardware_enabled_)
265 UpdateMemoryPolicy(); 239 UpdateMemoryPolicy();
266 return hardware_enabled_; 240 return hardware_enabled_;
267 } 241 }
268 242
269 scoped_ptr<ChildFrame> child_frame = make_scoped_ptr(new ChildFrame( 243 scoped_ptr<ChildFrame> child_frame = make_scoped_ptr(new ChildFrame(
270 frame.output_surface_id, std::move(frame.frame), 244 frame.output_surface_id, std::move(frame.frame),
271 GetCompositorID(compositor_), viewport_rect_for_tile_priority.IsEmpty(), 245 GetCompositorID(compositor_), viewport_rect_for_tile_priority.IsEmpty(),
272 transform_for_tile_priority, offscreen_pre_raster_, 246 transform_for_tile_priority, offscreen_pre_raster_,
273 parent_draw_constraints.is_layer)); 247 external_draw_constraints_.is_layer));
274 248
275 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); 249 ReturnUnusedResource(shared_renderer_state_->PassUncommittedFrameOnUI());
276 shared_renderer_state_.SetCompositorFrameOnUI(std::move(child_frame)); 250 shared_renderer_state_->SetFrameOnUI(std::move(child_frame));
277 return true; 251 return true;
278 } 252 }
279 253
280 void BrowserViewRenderer::UpdateParentDrawConstraints() { 254 void BrowserViewRenderer::UpdateParentDrawConstraints(
255 const ParentCompositorDrawConstraints& external_draw_constraints) {
boliu 2016/03/30 16:12:13 Maybe this should not take any args, and should ha
Tobias Sargeant 2016/03/30 17:17:16 Done, removed ParentDrawConstraintsUpdated from BV
281 PostInvalidate(); 256 PostInvalidate();
282 ParentCompositorDrawConstraints parent_draw_constraints = 257 external_draw_constraints_ = external_draw_constraints;
283 shared_renderer_state_.GetParentDrawConstraintsOnUI(); 258 client_->ParentDrawConstraintsUpdated(external_draw_constraints);
284 client_->ParentDrawConstraintsUpdated(parent_draw_constraints); 259 UpdateMemoryPolicy();
285 } 260 }
286 261
287 void BrowserViewRenderer::ReturnUnusedResource( 262 void BrowserViewRenderer::ReturnUnusedResource(
288 scoped_ptr<ChildFrame> child_frame) { 263 scoped_ptr<ChildFrame> child_frame) {
289 if (!child_frame.get() || !child_frame->frame.get()) 264 if (!child_frame.get() || !child_frame->frame.get())
290 return; 265 return;
291 266
292 cc::CompositorFrameAck frame_ack; 267 cc::CompositorFrameAck frame_ack;
293 cc::TransferableResource::ReturnResources( 268 cc::TransferableResource::ReturnResources(
294 child_frame->frame->delegated_frame_data->resource_list, 269 child_frame->frame->delegated_frame_data->resource_list,
295 &frame_ack.resources); 270 &frame_ack.resources);
296 content::SynchronousCompositor* compositor = 271 content::SynchronousCompositor* compositor =
297 compositor_map_[child_frame->compositor_id]; 272 compositor_map_[child_frame->compositor_id];
298 if (compositor && !frame_ack.resources.empty()) 273 if (compositor && !frame_ack.resources.empty())
299 compositor->ReturnResources(child_frame->output_surface_id, frame_ack); 274 compositor->ReturnResources(child_frame->output_surface_id, frame_ack);
300 } 275 }
301 276
302 void BrowserViewRenderer::ReturnResourceFromParent() { 277 void BrowserViewRenderer::ReturnResourceFromParent() {
278 DCHECK(shared_renderer_state_);
303 SharedRendererState::ReturnedResourcesMap returned_resource_map; 279 SharedRendererState::ReturnedResourcesMap returned_resource_map;
304 shared_renderer_state_.SwapReturnedResourcesOnUI(&returned_resource_map); 280 shared_renderer_state_->SwapReturnedResourcesOnUI(&returned_resource_map);
305 for (auto iterator = returned_resource_map.begin(); 281 for (auto iterator = returned_resource_map.begin();
306 iterator != returned_resource_map.end(); iterator++) { 282 iterator != returned_resource_map.end(); iterator++) {
307 uint32_t compositor_id = iterator->first; 283 uint32_t compositor_id = iterator->first;
308 content::SynchronousCompositor* compositor = compositor_map_[compositor_id]; 284 content::SynchronousCompositor* compositor = compositor_map_[compositor_id];
309 cc::CompositorFrameAck frame_ack; 285 cc::CompositorFrameAck frame_ack;
310 frame_ack.resources.swap(iterator->second.resources); 286 frame_ack.resources.swap(iterator->second.resources);
311 287
312 if (compositor && !frame_ack.resources.empty()) { 288 if (compositor && !frame_ack.resources.empty()) {
313 compositor->ReturnResources(iterator->second.output_surface_id, 289 compositor->ReturnResources(iterator->second.output_surface_id,
314 frame_ack); 290 frame_ack);
315 } 291 }
316 } 292 }
317 } 293 }
318 294
319 void BrowserViewRenderer::DetachFunctorFromView() {
320 client_->DetachFunctorFromView();
321 }
322
323 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { 295 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) {
324 return CanOnDraw() && CompositeSW(canvas); 296 return CanOnDraw() && CompositeSW(canvas);
325 } 297 }
326 298
327 skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width, 299 skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width,
328 int height) { 300 int height) {
329 TRACE_EVENT0("android_webview", "BrowserViewRenderer::CapturePicture"); 301 TRACE_EVENT0("android_webview", "BrowserViewRenderer::CapturePicture");
330 302
331 // Return empty Picture objects for empty SkPictures. 303 // Return empty Picture objects for empty SkPictures.
332 if (width <= 0 || height <= 0) { 304 if (width <= 0 || height <= 0) {
(...skipping 27 matching lines...) Expand all
360 TRACE_EVENT_SCOPE_THREAD); 332 TRACE_EVENT_SCOPE_THREAD);
361 if (clear_view_) 333 if (clear_view_)
362 return; 334 return;
363 335
364 clear_view_ = true; 336 clear_view_ = true;
365 // Always invalidate ignoring the compositor to actually clear the webview. 337 // Always invalidate ignoring the compositor to actually clear the webview.
366 PostInvalidate(); 338 PostInvalidate();
367 } 339 }
368 340
369 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { 341 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) {
370 if (offscreen_pre_raster_ != enable && compositor_)
boliu 2016/03/30 16:12:13 You can leave the first half of this check
Tobias Sargeant 2016/03/30 17:17:16 Wasn't this wrong before? UpdateMemoryPolicy uses
371 UpdateMemoryPolicy();
372
373 offscreen_pre_raster_ = enable; 342 offscreen_pre_raster_ = enable;
343 UpdateMemoryPolicy();
374 } 344 }
375 345
376 void BrowserViewRenderer::SetIsPaused(bool paused) { 346 void BrowserViewRenderer::SetIsPaused(bool paused) {
377 TRACE_EVENT_INSTANT1("android_webview", 347 TRACE_EVENT_INSTANT1("android_webview",
378 "BrowserViewRenderer::SetIsPaused", 348 "BrowserViewRenderer::SetIsPaused",
379 TRACE_EVENT_SCOPE_THREAD, 349 TRACE_EVENT_SCOPE_THREAD,
380 "paused", 350 "paused",
381 paused); 351 paused);
382 is_paused_ = paused; 352 is_paused_ = paused;
383 UpdateCompositorIsActive(); 353 UpdateCompositorIsActive();
(...skipping 20 matching lines...) Expand all
404 374
405 void BrowserViewRenderer::OnSizeChanged(int width, int height) { 375 void BrowserViewRenderer::OnSizeChanged(int width, int height) {
406 TRACE_EVENT_INSTANT2("android_webview", 376 TRACE_EVENT_INSTANT2("android_webview",
407 "BrowserViewRenderer::OnSizeChanged", 377 "BrowserViewRenderer::OnSizeChanged",
408 TRACE_EVENT_SCOPE_THREAD, 378 TRACE_EVENT_SCOPE_THREAD,
409 "width", 379 "width",
410 width, 380 width,
411 "height", 381 "height",
412 height); 382 height);
413 size_.SetSize(width, height); 383 size_.SetSize(width, height);
384 if (offscreen_pre_raster_)
385 UpdateMemoryPolicy();
414 } 386 }
415 387
416 void BrowserViewRenderer::OnAttachedToWindow(int width, int height) { 388 void BrowserViewRenderer::OnAttachedToWindow(int width, int height) {
417 TRACE_EVENT2("android_webview", 389 TRACE_EVENT2("android_webview",
418 "BrowserViewRenderer::OnAttachedToWindow", 390 "BrowserViewRenderer::OnAttachedToWindow",
419 "width", 391 "width",
420 width, 392 width,
421 "height", 393 "height",
422 height); 394 height);
423 attached_to_window_ = true; 395 attached_to_window_ = true;
424 size_.SetSize(width, height); 396 size_.SetSize(width, height);
397 if (offscreen_pre_raster_)
398 UpdateMemoryPolicy();
425 UpdateCompositorIsActive(); 399 UpdateCompositorIsActive();
426 } 400 }
427 401
428 void BrowserViewRenderer::OnDetachedFromWindow() { 402 void BrowserViewRenderer::OnDetachedFromWindow() {
429 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); 403 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow");
430 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); 404 hardware_enabled_ = false;
431 attached_to_window_ = false; 405 attached_to_window_ = false;
432 DCHECK(!hardware_enabled_); 406 ReturnUnusedResource(shared_renderer_state_->PassUncommittedFrameOnUI());
407 ReturnResourceFromParent();
408 UpdateMemoryPolicy();
433 UpdateCompositorIsActive(); 409 UpdateCompositorIsActive();
434 } 410 }
435 411
436 void BrowserViewRenderer::OnComputeScroll(base::TimeTicks animation_time) { 412 void BrowserViewRenderer::OnComputeScroll(base::TimeTicks animation_time) {
437 if (!compositor_) 413 if (!compositor_)
438 return; 414 return;
439 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnComputeScroll"); 415 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnComputeScroll");
440 compositor_->OnComputeScroll(animation_time); 416 compositor_->OnComputeScroll(animation_time);
441 } 417 }
442 418
443 void BrowserViewRenderer::ReleaseHardware() {
444 DCHECK(hardware_enabled_);
445 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI());
446 ReturnResourceFromParent();
447 DCHECK(shared_renderer_state_.ReturnedResourcesEmptyOnUI());
448
449 if (compositor_) {
450 compositor_->SetMemoryPolicy(0u);
451 }
452
453 hardware_enabled_ = false;
454 }
455
456 bool BrowserViewRenderer::IsVisible() const { 419 bool BrowserViewRenderer::IsVisible() const {
457 // Ignore |window_visible_| if |attached_to_window_| is false. 420 // Ignore |window_visible_| if |attached_to_window_| is false.
458 return view_visible_ && (!attached_to_window_ || window_visible_); 421 return view_visible_ && (!attached_to_window_ || window_visible_);
459 } 422 }
460 423
461 bool BrowserViewRenderer::IsClientVisible() const { 424 bool BrowserViewRenderer::IsClientVisible() const {
462 if (disable_page_visibility_) 425 if (disable_page_visibility_)
463 return !is_paused_; 426 return !is_paused_;
464 427
465 return !is_paused_ && (!attached_to_window_ || window_visible_); 428 return !is_paused_ && (!attached_to_window_ || window_visible_);
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
694 } 657 }
695 658
696 void BrowserViewRenderer::PostInvalidate() { 659 void BrowserViewRenderer::PostInvalidate() {
697 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate", 660 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate",
698 TRACE_EVENT_SCOPE_THREAD); 661 TRACE_EVENT_SCOPE_THREAD);
699 client_->PostInvalidate(); 662 client_->PostInvalidate();
700 } 663 }
701 664
702 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { 665 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) {
703 DCHECK(compositor_); 666 DCHECK(compositor_);
704 ReturnResourceFromParent();
705 return compositor_->DemandDrawSw(canvas); 667 return compositor_->DemandDrawSw(canvas);
706 } 668 }
707 669
708 void BrowserViewRenderer::UpdateCompositorIsActive() { 670 void BrowserViewRenderer::UpdateCompositorIsActive() {
709 if (compositor_) { 671 if (compositor_) {
710 compositor_->SetIsActive(!is_paused_ && 672 compositor_->SetIsActive(!is_paused_ &&
711 (!attached_to_window_ || window_visible_)); 673 (!attached_to_window_ || window_visible_));
712 } 674 }
713 } 675 }
714 676
(...skipping 14 matching lines...) Expand all
729 base::StringAppendF(&str, 691 base::StringAppendF(&str,
730 "overscroll_rounding_error_: %s ", 692 "overscroll_rounding_error_: %s ",
731 overscroll_rounding_error_.ToString().c_str()); 693 overscroll_rounding_error_.ToString().c_str());
732 base::StringAppendF( 694 base::StringAppendF(
733 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); 695 &str, "on_new_picture_enable: %d ", on_new_picture_enable_);
734 base::StringAppendF(&str, "clear_view: %d ", clear_view_); 696 base::StringAppendF(&str, "clear_view: %d ", clear_view_);
735 return str; 697 return str;
736 } 698 }
737 699
738 } // namespace android_webview 700 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698