| 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 |