Chromium Code Reviews| 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" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 81 BrowserViewRenderer* BrowserViewRenderer::FromWebContents( | 81 BrowserViewRenderer* BrowserViewRenderer::FromWebContents( |
| 82 content::WebContents* web_contents) { | 82 content::WebContents* web_contents) { |
| 83 return BrowserViewRendererUserData::GetBrowserViewRenderer(web_contents); | 83 return BrowserViewRendererUserData::GetBrowserViewRenderer(web_contents); |
| 84 } | 84 } |
| 85 | 85 |
| 86 BrowserViewRenderer::BrowserViewRenderer( | 86 BrowserViewRenderer::BrowserViewRenderer( |
| 87 BrowserViewRendererClient* client, | 87 BrowserViewRendererClient* client, |
| 88 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner, | 88 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner, |
| 89 bool disable_page_visibility) | 89 bool disable_page_visibility) |
| 90 : client_(client), | 90 : client_(client), |
| 91 shared_renderer_state_(ui_task_runner, this), | 91 shared_renderer_state_(nullptr), |
| 92 ui_task_runner_(ui_task_runner), | 92 ui_task_runner_(ui_task_runner), |
| 93 disable_page_visibility_(disable_page_visibility), | 93 disable_page_visibility_(disable_page_visibility), |
| 94 compositor_(NULL), | 94 compositor_(NULL), |
| 95 is_paused_(false), | 95 is_paused_(false), |
| 96 view_visible_(false), | 96 view_visible_(false), |
| 97 window_visible_(false), | 97 window_visible_(false), |
| 98 attached_to_window_(false), | 98 attached_to_window_(false), |
| 99 hardware_enabled_(false), | 99 hardware_enabled_(false), |
| 100 dip_scale_(0.f), | 100 dip_scale_(0.f), |
| 101 page_scale_factor_(1.f), | 101 page_scale_factor_(1.f), |
| 102 min_page_scale_factor_(0.f), | 102 min_page_scale_factor_(0.f), |
| 103 max_page_scale_factor_(0.f), | 103 max_page_scale_factor_(0.f), |
| 104 on_new_picture_enable_(false), | 104 on_new_picture_enable_(false), |
| 105 clear_view_(false), | 105 clear_view_(false), |
| 106 offscreen_pre_raster_(false), | 106 offscreen_pre_raster_(false), |
| 107 next_compositor_id_(1) {} | 107 next_compositor_id_(1) {} |
| 108 | 108 |
| 109 BrowserViewRenderer::~BrowserViewRenderer() { | 109 BrowserViewRenderer::~BrowserViewRenderer() { |
| 110 DCHECK(compositor_map_.empty()); | 110 DCHECK(compositor_map_.empty()); |
| 111 SetSharedRendererState(nullptr); | |
| 111 } | 112 } |
| 112 | 113 |
| 113 void BrowserViewRenderer::RegisterWithWebContents( | 114 void BrowserViewRenderer::RegisterWithWebContents( |
| 114 content::WebContents* web_contents) { | 115 content::WebContents* web_contents) { |
| 115 web_contents->SetUserData(kBrowserViewRendererUserDataKey, | 116 web_contents->SetUserData(kBrowserViewRendererUserDataKey, |
| 116 new BrowserViewRendererUserData(this)); | 117 new BrowserViewRendererUserData(this)); |
| 117 } | 118 } |
| 118 | 119 |
| 120 void BrowserViewRenderer::SetSharedRendererState( | |
| 121 SharedRendererState* shared_renderer_state) { | |
| 122 if (shared_renderer_state_ == shared_renderer_state) return; | |
| 123 | |
| 124 if (shared_renderer_state_) { | |
| 125 shared_renderer_state_->SetBrowserViewRendererOnUI(nullptr); | |
| 126 } | |
| 127 shared_renderer_state_ = shared_renderer_state; | |
| 128 if (shared_renderer_state_) { | |
| 129 shared_renderer_state_->SetBrowserViewRendererOnUI(this); | |
| 130 } | |
| 131 } | |
| 132 | |
| 119 SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() { | 133 SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() { |
| 120 return &shared_renderer_state_; | 134 return shared_renderer_state_; |
| 121 } | 135 } |
| 122 | 136 |
| 123 bool BrowserViewRenderer::RequestDrawGL(bool wait_for_completion) { | 137 bool BrowserViewRenderer::RequestDrawGL(bool wait_for_completion) { |
| 124 return client_->RequestDrawGL(wait_for_completion); | 138 return client_->RequestDrawGL(wait_for_completion); |
| 125 } | 139 } |
| 126 | 140 |
| 127 void BrowserViewRenderer::TrimMemory(const int level, const bool visible) { | 141 void BrowserViewRenderer::TrimMemory(const int level, const bool visible) { |
| 128 DCHECK(ui_task_runner_->BelongsToCurrentThread()); | 142 DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
| 129 // Constants from Android ComponentCallbacks2. | 143 // Constants from Android ComponentCallbacks2. |
| 130 enum { | 144 enum { |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 143 // Do not release resources on view we expect to get DrawGL soon. | 157 // Do not release resources on view we expect to get DrawGL soon. |
| 144 if (level < TRIM_MEMORY_BACKGROUND && visible) | 158 if (level < TRIM_MEMORY_BACKGROUND && visible) |
| 145 return; | 159 return; |
| 146 | 160 |
| 147 // Nothing to drop. | 161 // Nothing to drop. |
| 148 if (!compositor_ || !hardware_enabled_) | 162 if (!compositor_ || !hardware_enabled_) |
| 149 return; | 163 return; |
| 150 | 164 |
| 151 TRACE_EVENT0("android_webview", "BrowserViewRenderer::TrimMemory"); | 165 TRACE_EVENT0("android_webview", "BrowserViewRenderer::TrimMemory"); |
| 152 | 166 |
| 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 | 167 // Just set the memory limit to 0 and drop all tiles. This will be reset to |
| 164 // normal levels in the next DrawGL call. | 168 // normal levels in the next DrawGL call. |
| 165 // TODO(hush): need to setMemoryPolicy to 0 for non-current compositors too. | 169 // 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 | 170 // But WebView only has non-current compositors temporarily. So don't have to |
| 167 // do it now. | 171 // do it now. |
| 168 if (!offscreen_pre_raster_) | 172 if (!offscreen_pre_raster_) |
| 169 compositor_->SetMemoryPolicy(0u); | 173 compositor_->SetMemoryPolicy(0u); |
| 170 } | 174 } |
| 171 | 175 |
| 172 void BrowserViewRenderer::UpdateMemoryPolicy() { | 176 gfx::Rect BrowserViewRenderer::GetInterestRect(bool is_layer) const { |
| 177 if (is_layer || offscreen_pre_raster_) { | |
| 178 return gfx::Rect(size_); | |
| 179 } else { | |
| 180 return last_on_draw_global_visible_rect_; | |
| 181 } | |
| 182 } | |
| 183 | |
| 184 void BrowserViewRenderer::UpdateMemoryPolicy(gfx::Rect interest_rect) { | |
| 185 if (!compositor_) { | |
| 186 return; | |
| 187 } | |
| 188 | |
| 173 if (!hardware_enabled_) { | 189 if (!hardware_enabled_) { |
| 174 compositor_->SetMemoryPolicy(0u); | 190 compositor_->SetMemoryPolicy(0u); |
| 175 return; | 191 return; |
| 176 } | 192 } |
| 177 | 193 |
| 178 size_t bytes_limit = 0u; | 194 size_t bytes_limit = 0u; |
| 179 if (g_memory_override_in_bytes) { | 195 if (g_memory_override_in_bytes) { |
| 180 bytes_limit = static_cast<size_t>(g_memory_override_in_bytes); | 196 bytes_limit = static_cast<size_t>(g_memory_override_in_bytes); |
| 181 } else { | 197 } else { |
| 182 ParentCompositorDrawConstraints parent_draw_constraints = | |
| 183 shared_renderer_state_.GetParentDrawConstraintsOnUI(); | |
| 184 gfx::Rect interest_rect = | |
| 185 offscreen_pre_raster_ || parent_draw_constraints.is_layer | |
| 186 ? gfx::Rect(size_) | |
| 187 : last_on_draw_global_visible_rect_; | |
| 188 size_t width = interest_rect.width(); | 198 size_t width = interest_rect.width(); |
| 189 size_t height = interest_rect.height(); | 199 size_t height = interest_rect.height(); |
| 190 bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; | 200 bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; |
| 191 // Round up to a multiple of kMemoryAllocationStep. | 201 // Round up to a multiple of kMemoryAllocationStep. |
| 192 bytes_limit = | 202 bytes_limit = |
| 193 (bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep; | 203 (bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep; |
| 194 } | 204 } |
| 195 | 205 |
| 196 compositor_->SetMemoryPolicy(bytes_limit); | 206 compositor_->SetMemoryPolicy(bytes_limit); |
| 197 } | 207 } |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 210 } | 220 } |
| 211 if (clear_view_) { | 221 if (clear_view_) { |
| 212 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_ClearView", | 222 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_ClearView", |
| 213 TRACE_EVENT_SCOPE_THREAD); | 223 TRACE_EVENT_SCOPE_THREAD); |
| 214 return false; | 224 return false; |
| 215 } | 225 } |
| 216 | 226 |
| 217 return true; | 227 return true; |
| 218 } | 228 } |
| 219 | 229 |
| 220 bool BrowserViewRenderer::OnDrawHardware() { | 230 scoped_ptr<ChildFrame> BrowserViewRenderer::OnDrawHardware( |
| 231 const ParentCompositorDrawConstraints& parent_draw_constraints) { | |
| 221 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware"); | 232 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware"); |
| 222 | 233 |
| 223 shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI(); | |
| 224 | |
| 225 if (!CanOnDraw()) { | 234 if (!CanOnDraw()) { |
| 226 return false; | 235 return nullptr; |
| 227 } | 236 } |
| 228 | 237 |
| 229 shared_renderer_state_.SetScrollOffsetOnUI(last_on_draw_scroll_offset_); | |
| 230 hardware_enabled_ = true; | 238 hardware_enabled_ = true; |
| 231 | 239 |
| 232 ReturnResourceFromParent(); | |
| 233 UpdateMemoryPolicy(); | |
| 234 | |
| 235 ParentCompositorDrawConstraints parent_draw_constraints = | |
| 236 shared_renderer_state_.GetParentDrawConstraintsOnUI(); | |
| 237 gfx::Size surface_size(size_); | 240 gfx::Size surface_size(size_); |
| 238 gfx::Rect viewport(surface_size); | 241 gfx::Rect viewport(surface_size); |
| 239 gfx::Rect clip = viewport; | 242 gfx::Rect clip = viewport; |
| 240 gfx::Transform transform_for_tile_priority = | 243 gfx::Transform transform_for_tile_priority = |
| 241 parent_draw_constraints.transform; | 244 parent_draw_constraints.transform; |
| 242 | 245 |
| 243 // If the WebView is on a layer, WebView does not know what transform is | 246 // 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. | 247 // applied onto the layer so global visible rect does not make sense here. |
| 245 // In this case, just use the surface rect for tiling. | 248 // In this case, just use the surface rect for tiling. |
| 246 gfx::Rect viewport_rect_for_tile_priority; | 249 gfx::Rect viewport_rect_for_tile_priority; |
| 247 | 250 |
| 248 // Leave viewport_rect_for_tile_priority empty if offscreen_pre_raster_ is on. | 251 // Leave viewport_rect_for_tile_priority empty if offscreen_pre_raster_ is on. |
| 249 if (!offscreen_pre_raster_ && !parent_draw_constraints.is_layer) { | 252 if (!offscreen_pre_raster_ && !parent_draw_constraints.is_layer) { |
| 250 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; | 253 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; |
| 251 } | 254 } |
| 252 | 255 |
| 253 content::SynchronousCompositor::Frame frame = | 256 content::SynchronousCompositor::Frame frame = compositor_->DemandDrawHw( |
| 254 compositor_->DemandDrawHw(surface_size, | 257 surface_size, gfx::Transform(), viewport, clip, |
| 255 gfx::Transform(), | 258 viewport_rect_for_tile_priority, transform_for_tile_priority); |
| 256 viewport, | 259 |
| 257 clip, | |
| 258 viewport_rect_for_tile_priority, | |
| 259 transform_for_tile_priority); | |
| 260 if (!frame.frame.get()) { | 260 if (!frame.frame.get()) { |
| 261 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", | 261 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", |
| 262 TRACE_EVENT_SCOPE_THREAD); | 262 TRACE_EVENT_SCOPE_THREAD); |
| 263 return shared_renderer_state_.HasFrameOnUI(); | 263 return nullptr; |
| 264 } | 264 } |
| 265 | 265 |
| 266 scoped_ptr<ChildFrame> child_frame = make_scoped_ptr(new ChildFrame( | 266 return make_scoped_ptr(new ChildFrame( |
| 267 frame.output_surface_id, std::move(frame.frame), | 267 frame.output_surface_id, std::move(frame.frame), |
| 268 GetCompositorID(compositor_), viewport_rect_for_tile_priority.IsEmpty(), | 268 GetCompositorID(compositor_), viewport_rect_for_tile_priority.IsEmpty(), |
| 269 transform_for_tile_priority, offscreen_pre_raster_, | 269 transform_for_tile_priority, offscreen_pre_raster_, |
| 270 parent_draw_constraints.is_layer)); | 270 parent_draw_constraints.is_layer)); |
| 271 | |
| 272 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); | |
| 273 shared_renderer_state_.SetCompositorFrameOnUI(std::move(child_frame)); | |
| 274 return true; | |
| 275 } | 271 } |
| 276 | 272 |
| 277 void BrowserViewRenderer::UpdateParentDrawConstraints() { | 273 void BrowserViewRenderer::UpdateParentDrawConstraints() { |
| 274 DCHECK(shared_renderer_state_); | |
| 278 PostInvalidate(); | 275 PostInvalidate(); |
| 279 ParentCompositorDrawConstraints parent_draw_constraints = | 276 ParentCompositorDrawConstraints parent_draw_constraints = |
| 280 shared_renderer_state_.GetParentDrawConstraintsOnUI(); | 277 shared_renderer_state_->GetParentDrawConstraintsOnUI(); |
| 281 client_->ParentDrawConstraintsUpdated(parent_draw_constraints); | 278 client_->ParentDrawConstraintsUpdated(parent_draw_constraints); |
| 282 } | 279 } |
| 283 | 280 |
| 284 void BrowserViewRenderer::ReturnUnusedResource( | 281 void BrowserViewRenderer::ReturnUnusedResource( |
| 285 scoped_ptr<ChildFrame> child_frame) { | 282 scoped_ptr<ChildFrame> child_frame) { |
| 286 if (!child_frame.get() || !child_frame->frame.get()) | 283 if (!child_frame.get() || !child_frame->frame.get()) |
| 287 return; | 284 return; |
| 288 | 285 |
| 289 cc::CompositorFrameAck frame_ack; | 286 cc::ReturnedResourceArray returned_resources; |
| 290 cc::TransferableResource::ReturnResources( | 287 cc::TransferableResource::ReturnResources( |
| 291 child_frame->frame->delegated_frame_data->resource_list, | 288 child_frame->frame->delegated_frame_data->resource_list, |
| 292 &frame_ack.resources); | 289 &returned_resources); |
| 293 content::SynchronousCompositor* compositor = | 290 ReturnResourceFromParent(child_frame->compositor_id, |
| 294 compositor_map_[child_frame->compositor_id]; | 291 child_frame->output_surface_id, &returned_resources); |
| 295 if (compositor && !frame_ack.resources.empty()) | |
| 296 compositor->ReturnResources(child_frame->output_surface_id, frame_ack); | |
| 297 } | 292 } |
| 298 | 293 |
| 299 void BrowserViewRenderer::ReturnResourceFromParent() { | 294 void BrowserViewRenderer::ReturnResourceFromParent( |
| 300 SharedRendererState::ReturnedResourcesMap returned_resource_map; | 295 uint32_t compositor_id, uint32_t output_surface_id, |
| 301 shared_renderer_state_.SwapReturnedResourcesOnUI(&returned_resource_map); | 296 cc::ReturnedResourceArray* resources) { |
| 302 for (auto iterator = returned_resource_map.begin(); | 297 content::SynchronousCompositor* compositor = compositor_map_[compositor_id]; |
| 303 iterator != returned_resource_map.end(); iterator++) { | 298 cc::CompositorFrameAck frame_ack; |
| 304 uint32_t compositor_id = iterator->first; | 299 frame_ack.resources.swap(*resources); |
| 305 content::SynchronousCompositor* compositor = compositor_map_[compositor_id]; | 300 if (compositor && !frame_ack.resources.empty()) { |
| 306 cc::CompositorFrameAck frame_ack; | 301 compositor->ReturnResources(output_surface_id, frame_ack); |
| 307 frame_ack.resources.swap(iterator->second.resources); | |
| 308 | |
| 309 if (compositor && !frame_ack.resources.empty()) { | |
| 310 compositor->ReturnResources(iterator->second.output_surface_id, | |
| 311 frame_ack); | |
| 312 } | |
| 313 } | 302 } |
| 314 } | 303 } |
| 315 | 304 |
| 316 void BrowserViewRenderer::DetachFunctorFromView() { | 305 void BrowserViewRenderer::DetachFunctorFromView() { |
| 317 client_->DetachFunctorFromView(); | 306 client_->DetachFunctorFromView(); |
| 318 } | 307 } |
| 319 | 308 |
| 320 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { | 309 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { |
| 321 return CanOnDraw() && CompositeSW(canvas); | 310 return CanOnDraw() && CompositeSW(canvas); |
| 322 } | 311 } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 357 TRACE_EVENT_SCOPE_THREAD); | 346 TRACE_EVENT_SCOPE_THREAD); |
| 358 if (clear_view_) | 347 if (clear_view_) |
| 359 return; | 348 return; |
| 360 | 349 |
| 361 clear_view_ = true; | 350 clear_view_ = true; |
| 362 // Always invalidate ignoring the compositor to actually clear the webview. | 351 // Always invalidate ignoring the compositor to actually clear the webview. |
| 363 PostInvalidate(); | 352 PostInvalidate(); |
| 364 } | 353 } |
| 365 | 354 |
| 366 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { | 355 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { |
| 367 if (offscreen_pre_raster_ != enable && compositor_) | |
| 368 UpdateMemoryPolicy(); | |
| 369 | |
| 370 offscreen_pre_raster_ = enable; | 356 offscreen_pre_raster_ = enable; |
|
boliu
2016/03/23 20:42:32
It's ok to use the constraints from last draw here
| |
| 371 } | 357 } |
| 372 | 358 |
| 373 void BrowserViewRenderer::SetIsPaused(bool paused) { | 359 void BrowserViewRenderer::SetIsPaused(bool paused) { |
| 374 TRACE_EVENT_INSTANT1("android_webview", | 360 TRACE_EVENT_INSTANT1("android_webview", |
| 375 "BrowserViewRenderer::SetIsPaused", | 361 "BrowserViewRenderer::SetIsPaused", |
| 376 TRACE_EVENT_SCOPE_THREAD, | 362 TRACE_EVENT_SCOPE_THREAD, |
| 377 "paused", | 363 "paused", |
| 378 paused); | 364 paused); |
| 379 is_paused_ = paused; | 365 is_paused_ = paused; |
| 380 UpdateCompositorIsActive(); | 366 UpdateCompositorIsActive(); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 417 width, | 403 width, |
| 418 "height", | 404 "height", |
| 419 height); | 405 height); |
| 420 attached_to_window_ = true; | 406 attached_to_window_ = true; |
| 421 size_.SetSize(width, height); | 407 size_.SetSize(width, height); |
| 422 UpdateCompositorIsActive(); | 408 UpdateCompositorIsActive(); |
| 423 } | 409 } |
| 424 | 410 |
| 425 void BrowserViewRenderer::OnDetachedFromWindow() { | 411 void BrowserViewRenderer::OnDetachedFromWindow() { |
| 426 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); | 412 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); |
| 427 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); | 413 if (compositor_) { |
| 414 compositor_->SetMemoryPolicy(0u); | |
| 415 } | |
| 416 | |
| 417 hardware_enabled_ = false; | |
| 428 attached_to_window_ = false; | 418 attached_to_window_ = false; |
| 429 DCHECK(!hardware_enabled_); | |
| 430 UpdateCompositorIsActive(); | 419 UpdateCompositorIsActive(); |
| 431 } | 420 } |
| 432 | 421 |
| 433 void BrowserViewRenderer::OnComputeScroll(base::TimeTicks animation_time) { | 422 void BrowserViewRenderer::OnComputeScroll(base::TimeTicks animation_time) { |
| 434 if (!compositor_) | 423 if (!compositor_) |
| 435 return; | 424 return; |
| 436 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnComputeScroll"); | 425 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnComputeScroll"); |
| 437 compositor_->OnComputeScroll(animation_time); | 426 compositor_->OnComputeScroll(animation_time); |
| 438 } | 427 } |
| 439 | 428 |
| 440 void BrowserViewRenderer::ReleaseHardware() { | |
| 441 DCHECK(hardware_enabled_); | |
| 442 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI()); | |
| 443 ReturnResourceFromParent(); | |
| 444 DCHECK(shared_renderer_state_.ReturnedResourcesEmptyOnUI()); | |
| 445 | |
| 446 if (compositor_) { | |
| 447 compositor_->SetMemoryPolicy(0u); | |
| 448 } | |
| 449 | |
| 450 hardware_enabled_ = false; | |
| 451 } | |
| 452 | |
| 453 bool BrowserViewRenderer::IsVisible() const { | 429 bool BrowserViewRenderer::IsVisible() const { |
| 454 // Ignore |window_visible_| if |attached_to_window_| is false. | 430 // Ignore |window_visible_| if |attached_to_window_| is false. |
| 455 return view_visible_ && (!attached_to_window_ || window_visible_); | 431 return view_visible_ && (!attached_to_window_ || window_visible_); |
| 456 } | 432 } |
| 457 | 433 |
| 458 bool BrowserViewRenderer::IsClientVisible() const { | 434 bool BrowserViewRenderer::IsClientVisible() const { |
| 459 if (disable_page_visibility_) | 435 if (disable_page_visibility_) |
| 460 return !is_paused_; | 436 return !is_paused_; |
| 461 | 437 |
| 462 return !is_paused_ && (!attached_to_window_ || window_visible_); | 438 return !is_paused_ && (!attached_to_window_ || window_visible_); |
| (...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 691 } | 667 } |
| 692 | 668 |
| 693 void BrowserViewRenderer::PostInvalidate() { | 669 void BrowserViewRenderer::PostInvalidate() { |
| 694 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate", | 670 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate", |
| 695 TRACE_EVENT_SCOPE_THREAD); | 671 TRACE_EVENT_SCOPE_THREAD); |
| 696 client_->PostInvalidate(); | 672 client_->PostInvalidate(); |
| 697 } | 673 } |
| 698 | 674 |
| 699 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { | 675 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { |
| 700 DCHECK(compositor_); | 676 DCHECK(compositor_); |
| 701 ReturnResourceFromParent(); | |
| 702 return compositor_->DemandDrawSw(canvas); | 677 return compositor_->DemandDrawSw(canvas); |
| 703 } | 678 } |
| 704 | 679 |
| 705 void BrowserViewRenderer::UpdateCompositorIsActive() { | 680 void BrowserViewRenderer::UpdateCompositorIsActive() { |
| 706 if (compositor_) { | 681 if (compositor_) { |
| 707 compositor_->SetIsActive(!is_paused_ && | 682 compositor_->SetIsActive(!is_paused_ && |
| 708 (!attached_to_window_ || window_visible_)); | 683 (!attached_to_window_ || window_visible_)); |
| 709 } | 684 } |
| 710 } | 685 } |
| 711 | 686 |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 726 base::StringAppendF(&str, | 701 base::StringAppendF(&str, |
| 727 "overscroll_rounding_error_: %s ", | 702 "overscroll_rounding_error_: %s ", |
| 728 overscroll_rounding_error_.ToString().c_str()); | 703 overscroll_rounding_error_.ToString().c_str()); |
| 729 base::StringAppendF( | 704 base::StringAppendF( |
| 730 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); | 705 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); |
| 731 base::StringAppendF(&str, "clear_view: %d ", clear_view_); | 706 base::StringAppendF(&str, "clear_view: %d ", clear_view_); |
| 732 return str; | 707 return str; |
| 733 } | 708 } |
| 734 | 709 |
| 735 } // namespace android_webview | 710 } // namespace android_webview |
| OLD | NEW |