OLD | NEW |
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 Loading... |
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 Loading... |
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_); |
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::OnParentDrawConstraintsUpdated() { |
| 255 DCHECK(shared_renderer_state_); |
281 PostInvalidate(); | 256 PostInvalidate(); |
282 ParentCompositorDrawConstraints parent_draw_constraints = | 257 external_draw_constraints_ = |
283 shared_renderer_state_.GetParentDrawConstraintsOnUI(); | 258 shared_renderer_state_->GetParentDrawConstraintsOnUI(); |
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 Loading... |
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_) | 342 if (offscreen_pre_raster_ != enable) { |
| 343 offscreen_pre_raster_ = enable; |
371 UpdateMemoryPolicy(); | 344 UpdateMemoryPolicy(); |
372 | 345 } |
373 offscreen_pre_raster_ = enable; | |
374 } | 346 } |
375 | 347 |
376 void BrowserViewRenderer::SetIsPaused(bool paused) { | 348 void BrowserViewRenderer::SetIsPaused(bool paused) { |
377 TRACE_EVENT_INSTANT1("android_webview", | 349 TRACE_EVENT_INSTANT1("android_webview", |
378 "BrowserViewRenderer::SetIsPaused", | 350 "BrowserViewRenderer::SetIsPaused", |
379 TRACE_EVENT_SCOPE_THREAD, | 351 TRACE_EVENT_SCOPE_THREAD, |
380 "paused", | 352 "paused", |
381 paused); | 353 paused); |
382 is_paused_ = paused; | 354 is_paused_ = paused; |
383 UpdateCompositorIsActive(); | 355 UpdateCompositorIsActive(); |
(...skipping 20 matching lines...) Expand all Loading... |
404 | 376 |
405 void BrowserViewRenderer::OnSizeChanged(int width, int height) { | 377 void BrowserViewRenderer::OnSizeChanged(int width, int height) { |
406 TRACE_EVENT_INSTANT2("android_webview", | 378 TRACE_EVENT_INSTANT2("android_webview", |
407 "BrowserViewRenderer::OnSizeChanged", | 379 "BrowserViewRenderer::OnSizeChanged", |
408 TRACE_EVENT_SCOPE_THREAD, | 380 TRACE_EVENT_SCOPE_THREAD, |
409 "width", | 381 "width", |
410 width, | 382 width, |
411 "height", | 383 "height", |
412 height); | 384 height); |
413 size_.SetSize(width, height); | 385 size_.SetSize(width, height); |
| 386 if (offscreen_pre_raster_) |
| 387 UpdateMemoryPolicy(); |
414 } | 388 } |
415 | 389 |
416 void BrowserViewRenderer::OnAttachedToWindow(int width, int height) { | 390 void BrowserViewRenderer::OnAttachedToWindow(int width, int height) { |
417 TRACE_EVENT2("android_webview", | 391 TRACE_EVENT2("android_webview", |
418 "BrowserViewRenderer::OnAttachedToWindow", | 392 "BrowserViewRenderer::OnAttachedToWindow", |
419 "width", | 393 "width", |
420 width, | 394 width, |
421 "height", | 395 "height", |
422 height); | 396 height); |
423 attached_to_window_ = true; | 397 attached_to_window_ = true; |
424 size_.SetSize(width, height); | 398 size_.SetSize(width, height); |
| 399 if (offscreen_pre_raster_) |
| 400 UpdateMemoryPolicy(); |
425 UpdateCompositorIsActive(); | 401 UpdateCompositorIsActive(); |
426 } | 402 } |
427 | 403 |
428 void BrowserViewRenderer::OnDetachedFromWindow() { | 404 void BrowserViewRenderer::OnDetachedFromWindow() { |
429 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); | 405 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); |
430 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); | 406 hardware_enabled_ = false; |
431 attached_to_window_ = false; | 407 attached_to_window_ = false; |
432 DCHECK(!hardware_enabled_); | 408 ReturnUnusedResource(shared_renderer_state_->PassUncommittedFrameOnUI()); |
| 409 ReturnResourceFromParent(); |
| 410 UpdateMemoryPolicy(); |
433 UpdateCompositorIsActive(); | 411 UpdateCompositorIsActive(); |
434 } | 412 } |
435 | 413 |
436 void BrowserViewRenderer::OnComputeScroll(base::TimeTicks animation_time) { | 414 void BrowserViewRenderer::OnComputeScroll(base::TimeTicks animation_time) { |
437 if (!compositor_) | 415 if (!compositor_) |
438 return; | 416 return; |
439 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnComputeScroll"); | 417 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnComputeScroll"); |
440 compositor_->OnComputeScroll(animation_time); | 418 compositor_->OnComputeScroll(animation_time); |
441 } | 419 } |
442 | 420 |
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 { | 421 bool BrowserViewRenderer::IsVisible() const { |
457 // Ignore |window_visible_| if |attached_to_window_| is false. | 422 // Ignore |window_visible_| if |attached_to_window_| is false. |
458 return view_visible_ && (!attached_to_window_ || window_visible_); | 423 return view_visible_ && (!attached_to_window_ || window_visible_); |
459 } | 424 } |
460 | 425 |
461 bool BrowserViewRenderer::IsClientVisible() const { | 426 bool BrowserViewRenderer::IsClientVisible() const { |
462 if (disable_page_visibility_) | 427 if (disable_page_visibility_) |
463 return !is_paused_; | 428 return !is_paused_; |
464 | 429 |
465 return !is_paused_ && (!attached_to_window_ || window_visible_); | 430 return !is_paused_ && (!attached_to_window_ || window_visible_); |
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
694 } | 659 } |
695 | 660 |
696 void BrowserViewRenderer::PostInvalidate() { | 661 void BrowserViewRenderer::PostInvalidate() { |
697 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate", | 662 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate", |
698 TRACE_EVENT_SCOPE_THREAD); | 663 TRACE_EVENT_SCOPE_THREAD); |
699 client_->PostInvalidate(); | 664 client_->PostInvalidate(); |
700 } | 665 } |
701 | 666 |
702 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { | 667 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { |
703 DCHECK(compositor_); | 668 DCHECK(compositor_); |
704 ReturnResourceFromParent(); | |
705 return compositor_->DemandDrawSw(canvas); | 669 return compositor_->DemandDrawSw(canvas); |
706 } | 670 } |
707 | 671 |
708 void BrowserViewRenderer::UpdateCompositorIsActive() { | 672 void BrowserViewRenderer::UpdateCompositorIsActive() { |
709 if (compositor_) { | 673 if (compositor_) { |
710 compositor_->SetIsActive(!is_paused_ && | 674 compositor_->SetIsActive(!is_paused_ && |
711 (!attached_to_window_ || window_visible_)); | 675 (!attached_to_window_ || window_visible_)); |
712 } | 676 } |
713 } | 677 } |
714 | 678 |
(...skipping 14 matching lines...) Expand all Loading... |
729 base::StringAppendF(&str, | 693 base::StringAppendF(&str, |
730 "overscroll_rounding_error_: %s ", | 694 "overscroll_rounding_error_: %s ", |
731 overscroll_rounding_error_.ToString().c_str()); | 695 overscroll_rounding_error_.ToString().c_str()); |
732 base::StringAppendF( | 696 base::StringAppendF( |
733 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); | 697 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); |
734 base::StringAppendF(&str, "clear_view: %d ", clear_view_); | 698 base::StringAppendF(&str, "clear_view: %d ", clear_view_); |
735 return str; | 699 return str; |
736 } | 700 } |
737 | 701 |
738 } // namespace android_webview | 702 } // namespace android_webview |
OLD | NEW |