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

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: Created 4 years, 9 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 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 } 111 }
112 112
113 void BrowserViewRenderer::RegisterWithWebContents( 113 void BrowserViewRenderer::RegisterWithWebContents(
114 content::WebContents* web_contents) { 114 content::WebContents* web_contents) {
115 web_contents->SetUserData(kBrowserViewRendererUserDataKey, 115 web_contents->SetUserData(kBrowserViewRendererUserDataKey,
116 new BrowserViewRendererUserData(this)); 116 new BrowserViewRendererUserData(this));
117 } 117 }
118 118
119 SharedRendererState* BrowserViewRenderer::GetAwDrawGLViewContext() { 119 void BrowserViewRenderer::TrimMemory(const int level) {
boliu 2016/03/24 17:34:45 don't need to take level at all now
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()); 120 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. 121 // Nothing to drop.
148 if (!compositor_ || !hardware_enabled_) 122 if (!compositor_ || !hardware_enabled_)
149 return; 123 return;
150 124
151 TRACE_EVENT0("android_webview", "BrowserViewRenderer::TrimMemory"); 125 TRACE_EVENT0("android_webview", "BrowserViewRenderer::TrimMemory");
152 126
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 127 // Just set the memory limit to 0 and drop all tiles. This will be reset to
164 // normal levels in the next DrawGL call. 128 // normal levels in the next DrawGL call.
165 // TODO(hush): need to setMemoryPolicy to 0 for non-current compositors too. 129 // 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 130 // But WebView only has non-current compositors temporarily. So don't have to
167 // do it now. 131 // do it now.
168 if (!offscreen_pre_raster_) 132 if (!offscreen_pre_raster_)
169 compositor_->SetMemoryPolicy(0u); 133 compositor_->SetMemoryPolicy(0u);
170 } 134 }
171 135
172 void BrowserViewRenderer::UpdateMemoryPolicy() { 136 void BrowserViewRenderer::UpdateMemoryPolicy() {
137 if (!compositor_) {
138 return;
139 }
140
173 if (!hardware_enabled_) { 141 if (!hardware_enabled_) {
174 compositor_->SetMemoryPolicy(0u); 142 compositor_->SetMemoryPolicy(0u);
175 return; 143 return;
176 } 144 }
177 145
178 size_t bytes_limit = 0u; 146 size_t bytes_limit = 0u;
179 if (g_memory_override_in_bytes) { 147 if (g_memory_override_in_bytes) {
180 bytes_limit = static_cast<size_t>(g_memory_override_in_bytes); 148 bytes_limit = static_cast<size_t>(g_memory_override_in_bytes);
181 } else { 149 } else {
182 ParentCompositorDrawConstraints parent_draw_constraints =
183 shared_renderer_state_.GetParentDrawConstraintsOnUI();
184 gfx::Rect interest_rect = 150 gfx::Rect interest_rect =
185 offscreen_pre_raster_ || parent_draw_constraints.is_layer 151 offscreen_pre_raster_ || external_draw_constraints_.is_layer
186 ? gfx::Rect(size_) 152 ? gfx::Rect(size_)
187 : last_on_draw_global_visible_rect_; 153 : last_on_draw_global_visible_rect_;
188 size_t width = interest_rect.width(); 154 size_t width = interest_rect.width();
189 size_t height = interest_rect.height(); 155 size_t height = interest_rect.height();
190 bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height; 156 bytes_limit = kMemoryMultiplier * kBytesPerPixel * width * height;
191 // Round up to a multiple of kMemoryAllocationStep. 157 // Round up to a multiple of kMemoryAllocationStep.
192 bytes_limit = 158 bytes_limit =
193 (bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep; 159 (bytes_limit / kMemoryAllocationStep + 1) * kMemoryAllocationStep;
194 } 160 }
195 161
196 compositor_->SetMemoryPolicy(bytes_limit); 162 compositor_->SetMemoryPolicy(bytes_limit);
197 } 163 }
198 164
199 void BrowserViewRenderer::PrepareToDraw(const gfx::Vector2d& scroll, 165 void BrowserViewRenderer::PrepareToDraw(const gfx::Rect& global_visible_rect) {
200 const gfx::Rect& global_visible_rect) {
201 last_on_draw_scroll_offset_ = scroll;
202 last_on_draw_global_visible_rect_ = global_visible_rect; 166 last_on_draw_global_visible_rect_ = global_visible_rect;
203 } 167 }
204 168
205 bool BrowserViewRenderer::CanOnDraw() { 169 bool BrowserViewRenderer::CanOnDraw() {
206 if (!compositor_) { 170 if (!compositor_) {
207 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_NoCompositor", 171 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_NoCompositor",
208 TRACE_EVENT_SCOPE_THREAD); 172 TRACE_EVENT_SCOPE_THREAD);
209 return false; 173 return false;
210 } 174 }
211 if (clear_view_) { 175 if (clear_view_) {
212 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_ClearView", 176 TRACE_EVENT_INSTANT0("android_webview", "EarlyOut_ClearView",
213 TRACE_EVENT_SCOPE_THREAD); 177 TRACE_EVENT_SCOPE_THREAD);
214 return false; 178 return false;
215 } 179 }
216 180
217 return true; 181 return true;
218 } 182 }
219 183
220 bool BrowserViewRenderer::OnDrawHardware() { 184 scoped_ptr<ChildFrame> BrowserViewRenderer::OnDrawHardware() {
221 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware"); 185 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware");
222 186
223 shared_renderer_state_.InitializeHardwareDrawIfNeededOnUI(); 187 LOG(WARNING) << "XXX me=" << ToString();
224
225 if (!CanOnDraw()) { 188 if (!CanOnDraw()) {
226 return false; 189 LOG(WARNING) << "XXX CanOnDraw returned false";
190 return nullptr;
227 } 191 }
228 192
229 shared_renderer_state_.SetScrollOffsetOnUI(last_on_draw_scroll_offset_);
230 hardware_enabled_ = true; 193 hardware_enabled_ = true;
231 194
232 ReturnResourceFromParent();
233 UpdateMemoryPolicy();
234
235 ParentCompositorDrawConstraints parent_draw_constraints =
236 shared_renderer_state_.GetParentDrawConstraintsOnUI();
237 gfx::Size surface_size(size_); 195 gfx::Size surface_size(size_);
238 gfx::Rect viewport(surface_size); 196 gfx::Rect viewport(surface_size);
239 gfx::Rect clip = viewport; 197 gfx::Rect clip = viewport;
240 gfx::Transform transform_for_tile_priority = 198 gfx::Transform transform_for_tile_priority =
241 parent_draw_constraints.transform; 199 external_draw_constraints_.transform;
242 200
243 // If the WebView is on a layer, WebView does not know what transform is 201 // 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. 202 // applied onto the layer so global visible rect does not make sense here.
245 // In this case, just use the surface rect for tiling. 203 // In this case, just use the surface rect for tiling.
246 gfx::Rect viewport_rect_for_tile_priority; 204 gfx::Rect viewport_rect_for_tile_priority;
247 205
248 // Leave viewport_rect_for_tile_priority empty if offscreen_pre_raster_ is on. 206 // Leave viewport_rect_for_tile_priority empty if offscreen_pre_raster_ is on.
249 if (!offscreen_pre_raster_ && !parent_draw_constraints.is_layer) { 207 if (!offscreen_pre_raster_ && !external_draw_constraints_.is_layer) {
250 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_; 208 viewport_rect_for_tile_priority = last_on_draw_global_visible_rect_;
251 } 209 }
252 210
253 content::SynchronousCompositor::Frame frame = 211 content::SynchronousCompositor::Frame frame = compositor_->DemandDrawHw(
254 compositor_->DemandDrawHw(surface_size, 212 surface_size, gfx::Transform(), viewport, clip,
255 gfx::Transform(), 213 viewport_rect_for_tile_priority, transform_for_tile_priority);
256 viewport, 214
257 clip,
258 viewport_rect_for_tile_priority,
259 transform_for_tile_priority);
260 if (!frame.frame.get()) { 215 if (!frame.frame.get()) {
261 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame", 216 TRACE_EVENT_INSTANT0("android_webview", "NoNewFrame",
262 TRACE_EVENT_SCOPE_THREAD); 217 TRACE_EVENT_SCOPE_THREAD);
263 return shared_renderer_state_.HasFrameOnUI(); 218 return nullptr;
264 } 219 }
265 220
266 scoped_ptr<ChildFrame> child_frame = make_scoped_ptr(new ChildFrame( 221 return make_scoped_ptr(new ChildFrame(
267 frame.output_surface_id, std::move(frame.frame), 222 frame.output_surface_id, std::move(frame.frame),
268 GetCompositorID(compositor_), viewport_rect_for_tile_priority.IsEmpty(), 223 GetCompositorID(compositor_), viewport_rect_for_tile_priority.IsEmpty(),
269 transform_for_tile_priority, offscreen_pre_raster_, 224 transform_for_tile_priority, offscreen_pre_raster_,
270 parent_draw_constraints.is_layer)); 225 external_draw_constraints_.is_layer));
271
272 ReturnUnusedResource(shared_renderer_state_.PassUncommittedFrameOnUI());
273 shared_renderer_state_.SetCompositorFrameOnUI(std::move(child_frame));
274 return true;
275 } 226 }
276 227
277 void BrowserViewRenderer::UpdateParentDrawConstraints() { 228 void BrowserViewRenderer::UpdateParentDrawConstraints(
229 const ParentCompositorDrawConstraints& external_draw_constraints) {
278 PostInvalidate(); 230 PostInvalidate();
279 ParentCompositorDrawConstraints parent_draw_constraints = 231 external_draw_constraints_ = external_draw_constraints;
280 shared_renderer_state_.GetParentDrawConstraintsOnUI(); 232 UpdateMemoryPolicy();
281 client_->ParentDrawConstraintsUpdated(parent_draw_constraints);
282 } 233 }
283 234
284 void BrowserViewRenderer::ReturnUnusedResource( 235 void BrowserViewRenderer::ReturnUnusedResource(
285 scoped_ptr<ChildFrame> child_frame) { 236 scoped_ptr<ChildFrame> child_frame) {
286 if (!child_frame.get() || !child_frame->frame.get()) 237 if (!child_frame.get() || !child_frame->frame.get())
287 return; 238 return;
288 239
289 cc::CompositorFrameAck frame_ack; 240 cc::ReturnedResourceArray returned_resources;
290 cc::TransferableResource::ReturnResources( 241 cc::TransferableResource::ReturnResources(
291 child_frame->frame->delegated_frame_data->resource_list, 242 child_frame->frame->delegated_frame_data->resource_list,
292 &frame_ack.resources); 243 &returned_resources);
293 content::SynchronousCompositor* compositor = 244 ReturnResourceFromParent(child_frame->compositor_id,
294 compositor_map_[child_frame->compositor_id]; 245 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 } 246 }
298 247
299 void BrowserViewRenderer::ReturnResourceFromParent() { 248 void BrowserViewRenderer::ReturnResourceFromParent(
300 SharedRendererState::ReturnedResourcesMap returned_resource_map; 249 uint32_t compositor_id,
301 shared_renderer_state_.SwapReturnedResourcesOnUI(&returned_resource_map); 250 uint32_t output_surface_id,
302 for (auto iterator = returned_resource_map.begin(); 251 cc::ReturnedResourceArray* resources) {
303 iterator != returned_resource_map.end(); iterator++) { 252 content::SynchronousCompositor* compositor = compositor_map_[compositor_id];
304 uint32_t compositor_id = iterator->first; 253 cc::CompositorFrameAck frame_ack;
305 content::SynchronousCompositor* compositor = compositor_map_[compositor_id]; 254 frame_ack.resources.swap(*resources);
306 cc::CompositorFrameAck frame_ack; 255 if (compositor && !frame_ack.resources.empty()) {
307 frame_ack.resources.swap(iterator->second.resources); 256 compositor->ReturnResources(output_surface_id, frame_ack);
308
309 if (compositor && !frame_ack.resources.empty()) {
310 compositor->ReturnResources(iterator->second.output_surface_id,
311 frame_ack);
312 }
313 } 257 }
314 } 258 }
315 259
316 void BrowserViewRenderer::DetachFunctorFromView() {
317 client_->DetachFunctorFromView();
318 }
319
320 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) { 260 bool BrowserViewRenderer::OnDrawSoftware(SkCanvas* canvas) {
321 return CanOnDraw() && CompositeSW(canvas); 261 return CanOnDraw() && CompositeSW(canvas);
322 } 262 }
323 263
324 skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width, 264 skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width,
325 int height) { 265 int height) {
326 TRACE_EVENT0("android_webview", "BrowserViewRenderer::CapturePicture"); 266 TRACE_EVENT0("android_webview", "BrowserViewRenderer::CapturePicture");
327 267
328 // Return empty Picture objects for empty SkPictures. 268 // Return empty Picture objects for empty SkPictures.
329 if (width <= 0 || height <= 0) { 269 if (width <= 0 || height <= 0) {
(...skipping 27 matching lines...) Expand all
357 TRACE_EVENT_SCOPE_THREAD); 297 TRACE_EVENT_SCOPE_THREAD);
358 if (clear_view_) 298 if (clear_view_)
359 return; 299 return;
360 300
361 clear_view_ = true; 301 clear_view_ = true;
362 // Always invalidate ignoring the compositor to actually clear the webview. 302 // Always invalidate ignoring the compositor to actually clear the webview.
363 PostInvalidate(); 303 PostInvalidate();
364 } 304 }
365 305
366 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) { 306 void BrowserViewRenderer::SetOffscreenPreRaster(bool enable) {
367 if (offscreen_pre_raster_ != enable && compositor_)
368 UpdateMemoryPolicy();
369
370 offscreen_pre_raster_ = enable; 307 offscreen_pre_raster_ = enable;
308 UpdateMemoryPolicy();
371 } 309 }
372 310
373 void BrowserViewRenderer::SetIsPaused(bool paused) { 311 void BrowserViewRenderer::SetIsPaused(bool paused) {
374 TRACE_EVENT_INSTANT1("android_webview", 312 TRACE_EVENT_INSTANT1("android_webview",
375 "BrowserViewRenderer::SetIsPaused", 313 "BrowserViewRenderer::SetIsPaused",
376 TRACE_EVENT_SCOPE_THREAD, 314 TRACE_EVENT_SCOPE_THREAD,
377 "paused", 315 "paused",
378 paused); 316 paused);
379 is_paused_ = paused; 317 is_paused_ = paused;
380 UpdateCompositorIsActive(); 318 UpdateCompositorIsActive();
(...skipping 20 matching lines...) Expand all
401 339
402 void BrowserViewRenderer::OnSizeChanged(int width, int height) { 340 void BrowserViewRenderer::OnSizeChanged(int width, int height) {
403 TRACE_EVENT_INSTANT2("android_webview", 341 TRACE_EVENT_INSTANT2("android_webview",
404 "BrowserViewRenderer::OnSizeChanged", 342 "BrowserViewRenderer::OnSizeChanged",
405 TRACE_EVENT_SCOPE_THREAD, 343 TRACE_EVENT_SCOPE_THREAD,
406 "width", 344 "width",
407 width, 345 width,
408 "height", 346 "height",
409 height); 347 height);
410 size_.SetSize(width, height); 348 size_.SetSize(width, height);
349 if (offscreen_pre_raster_)
350 UpdateMemoryPolicy();
411 } 351 }
412 352
413 void BrowserViewRenderer::OnAttachedToWindow(int width, int height) { 353 void BrowserViewRenderer::OnAttachedToWindow(int width, int height) {
414 TRACE_EVENT2("android_webview", 354 TRACE_EVENT2("android_webview",
415 "BrowserViewRenderer::OnAttachedToWindow", 355 "BrowserViewRenderer::OnAttachedToWindow",
416 "width", 356 "width",
417 width, 357 width,
418 "height", 358 "height",
419 height); 359 height);
420 attached_to_window_ = true; 360 attached_to_window_ = true;
421 size_.SetSize(width, height); 361 size_.SetSize(width, height);
362 if (offscreen_pre_raster_)
363 UpdateMemoryPolicy();
422 UpdateCompositorIsActive(); 364 UpdateCompositorIsActive();
423 } 365 }
424 366
425 void BrowserViewRenderer::OnDetachedFromWindow() { 367 void BrowserViewRenderer::OnDetachedFromWindow() {
426 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); 368 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow");
427 shared_renderer_state_.ReleaseHardwareDrawIfNeededOnUI(); 369 if (compositor_) {
370 compositor_->SetMemoryPolicy(0u);
371 }
372
373 hardware_enabled_ = false;
boliu 2016/03/24 17:34:45 Feels like this should be hardware_enabled_ = fal
428 attached_to_window_ = false; 374 attached_to_window_ = false;
429 DCHECK(!hardware_enabled_);
430 UpdateCompositorIsActive(); 375 UpdateCompositorIsActive();
431 } 376 }
432 377
433 void BrowserViewRenderer::OnComputeScroll(base::TimeTicks animation_time) { 378 void BrowserViewRenderer::OnComputeScroll(base::TimeTicks animation_time) {
434 if (!compositor_) 379 if (!compositor_)
435 return; 380 return;
436 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnComputeScroll"); 381 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnComputeScroll");
437 compositor_->OnComputeScroll(animation_time); 382 compositor_->OnComputeScroll(animation_time);
438 } 383 }
439 384
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 { 385 bool BrowserViewRenderer::IsVisible() const {
454 // Ignore |window_visible_| if |attached_to_window_| is false. 386 // Ignore |window_visible_| if |attached_to_window_| is false.
455 return view_visible_ && (!attached_to_window_ || window_visible_); 387 return view_visible_ && (!attached_to_window_ || window_visible_);
456 } 388 }
457 389
458 bool BrowserViewRenderer::IsClientVisible() const { 390 bool BrowserViewRenderer::IsClientVisible() const {
459 if (disable_page_visibility_) 391 if (disable_page_visibility_)
460 return !is_paused_; 392 return !is_paused_;
461 393
462 return !is_paused_ && (!attached_to_window_ || window_visible_); 394 return !is_paused_ && (!attached_to_window_ || window_visible_);
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 } 623 }
692 624
693 void BrowserViewRenderer::PostInvalidate() { 625 void BrowserViewRenderer::PostInvalidate() {
694 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate", 626 TRACE_EVENT_INSTANT0("android_webview", "BrowserViewRenderer::PostInvalidate",
695 TRACE_EVENT_SCOPE_THREAD); 627 TRACE_EVENT_SCOPE_THREAD);
696 client_->PostInvalidate(); 628 client_->PostInvalidate();
697 } 629 }
698 630
699 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) { 631 bool BrowserViewRenderer::CompositeSW(SkCanvas* canvas) {
700 DCHECK(compositor_); 632 DCHECK(compositor_);
701 ReturnResourceFromParent();
702 return compositor_->DemandDrawSw(canvas); 633 return compositor_->DemandDrawSw(canvas);
703 } 634 }
704 635
705 void BrowserViewRenderer::UpdateCompositorIsActive() { 636 void BrowserViewRenderer::UpdateCompositorIsActive() {
706 if (compositor_) { 637 if (compositor_) {
707 compositor_->SetIsActive(!is_paused_ && 638 compositor_->SetIsActive(!is_paused_ &&
708 (!attached_to_window_ || window_visible_)); 639 (!attached_to_window_ || window_visible_));
709 } 640 }
710 } 641 }
711 642
(...skipping 14 matching lines...) Expand all
726 base::StringAppendF(&str, 657 base::StringAppendF(&str,
727 "overscroll_rounding_error_: %s ", 658 "overscroll_rounding_error_: %s ",
728 overscroll_rounding_error_.ToString().c_str()); 659 overscroll_rounding_error_.ToString().c_str());
729 base::StringAppendF( 660 base::StringAppendF(
730 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); 661 &str, "on_new_picture_enable: %d ", on_new_picture_enable_);
731 base::StringAppendF(&str, "clear_view: %d ", clear_view_); 662 base::StringAppendF(&str, "clear_view: %d ", clear_view_);
732 return str; 663 return str;
733 } 664 }
734 665
735 } // namespace android_webview 666 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698