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

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

Issue 655813004: Part 1: Refactor Android WebView graphics code (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@refactor
Patch Set: comments Created 6 years, 2 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 "android_webview/browser/browser_view_renderer_client.h" 7 #include "android_webview/browser/browser_view_renderer_client.h"
8 #include "android_webview/browser/shared_renderer_state.h" 8 #include "android_webview/browser/shared_renderer_state.h"
9 #include "android_webview/common/aw_switches.h" 9 #include "android_webview/common/aw_switches.h"
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 g_memory_override_in_bytes *= 1024 * 1024; 61 g_memory_override_in_bytes *= 1024 * 1024;
62 } 62 }
63 63
64 // There is no need to limit number of tiles, so use an effectively unlimited 64 // There is no need to limit number of tiles, so use an effectively unlimited
65 // value as the limit. 65 // value as the limit.
66 GlobalTileManager::GetInstance()->SetTileLimit(10 * 1000 * 1000); 66 GlobalTileManager::GetInstance()->SetTileLimit(10 * 1000 * 1000);
67 } 67 }
68 68
69 BrowserViewRenderer::BrowserViewRenderer( 69 BrowserViewRenderer::BrowserViewRenderer(
70 BrowserViewRendererClient* client, 70 BrowserViewRendererClient* client,
71 SharedRendererState* shared_renderer_state,
72 content::WebContents* web_contents, 71 content::WebContents* web_contents,
73 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner) 72 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner)
74 : client_(client), 73 : client_(client),
75 shared_renderer_state_(shared_renderer_state), 74 shared_renderer_state_(ui_task_runner, this),
76 web_contents_(web_contents), 75 web_contents_(web_contents),
77 ui_task_runner_(ui_task_runner), 76 ui_task_runner_(ui_task_runner),
78 compositor_(NULL), 77 compositor_(NULL),
79 is_paused_(false), 78 is_paused_(false),
80 view_visible_(false), 79 view_visible_(false),
81 window_visible_(false), 80 window_visible_(false),
82 attached_to_window_(false), 81 attached_to_window_(false),
83 hardware_enabled_(false), 82 hardware_enabled_(false),
84 dip_scale_(0.0), 83 dip_scale_(0.0),
85 page_scale_factor_(1.0), 84 page_scale_factor_(1.0),
(...skipping 11 matching lines...) Expand all
97 // Currently the logic in this class relies on |compositor_| remaining 96 // Currently the logic in this class relies on |compositor_| remaining
98 // NULL until the DidInitializeCompositor() call, hence it is not set here. 97 // NULL until the DidInitializeCompositor() call, hence it is not set here.
99 } 98 }
100 99
101 BrowserViewRenderer::~BrowserViewRenderer() { 100 BrowserViewRenderer::~BrowserViewRenderer() {
102 content::SynchronousCompositor::SetClientForWebContents(web_contents_, NULL); 101 content::SynchronousCompositor::SetClientForWebContents(web_contents_, NULL);
103 // OnDetachedFromWindow should be called before the destructor, so the memory 102 // OnDetachedFromWindow should be called before the destructor, so the memory
104 // policy should have already been updated. 103 // policy should have already been updated.
105 } 104 }
106 105
106 SharedRendererState* BrowserViewRenderer::GetSharedRendererState() {
107 return &shared_renderer_state_;
108 }
109
110 bool BrowserViewRenderer::RequestDrawGL(jobject canvas,
111 bool wait_for_completion) {
112 return client_->RequestDrawGL(canvas, wait_for_completion);
113 }
114
107 // This function updates the resource allocation in GlobalTileManager. 115 // This function updates the resource allocation in GlobalTileManager.
108 void BrowserViewRenderer::TrimMemory(const int level, const bool visible) { 116 void BrowserViewRenderer::TrimMemory(const int level, const bool visible) {
109 DCHECK(ui_task_runner_->BelongsToCurrentThread()); 117 DCHECK(ui_task_runner_->BelongsToCurrentThread());
110 // Constants from Android ComponentCallbacks2. 118 // Constants from Android ComponentCallbacks2.
111 enum { 119 enum {
112 TRIM_MEMORY_RUNNING_LOW = 10, 120 TRIM_MEMORY_RUNNING_LOW = 10,
113 TRIM_MEMORY_UI_HIDDEN = 20, 121 TRIM_MEMORY_UI_HIDDEN = 20,
114 TRIM_MEMORY_BACKGROUND = 40, 122 TRIM_MEMORY_BACKGROUND = 40,
115 }; 123 };
116 124
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 213
206 // Perform a software draw 214 // Perform a software draw
207 return OnDrawSoftware(java_canvas); 215 return OnDrawSoftware(java_canvas);
208 } 216 }
209 217
210 bool BrowserViewRenderer::OnDrawHardware(jobject java_canvas) { 218 bool BrowserViewRenderer::OnDrawHardware(jobject java_canvas) {
211 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware"); 219 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDrawHardware");
212 if (!compositor_) 220 if (!compositor_)
213 return false; 221 return false;
214 222
215 shared_renderer_state_->SetScrollOffset(last_on_draw_scroll_offset_); 223 shared_renderer_state_.SetScrollOffsetOnUI(last_on_draw_scroll_offset_);
216 224
217 if (!hardware_enabled_) { 225 if (!hardware_enabled_) {
218 hardware_enabled_ = compositor_->InitializeHwDraw(); 226 hardware_enabled_ = compositor_->InitializeHwDraw();
219 if (hardware_enabled_) { 227 if (hardware_enabled_) {
220 tile_manager_key_ = GlobalTileManager::GetInstance()->PushBack(this); 228 tile_manager_key_ = GlobalTileManager::GetInstance()->PushBack(this);
221 } 229 }
222 } 230 }
223 if (!hardware_enabled_) 231 if (!hardware_enabled_)
224 return false; 232 return false;
225 233
226 if (last_on_draw_global_visible_rect_.IsEmpty() && 234 if (last_on_draw_global_visible_rect_.IsEmpty() &&
227 parent_draw_constraints_.surface_rect.IsEmpty()) { 235 parent_draw_constraints_.surface_rect.IsEmpty()) {
228 TRACE_EVENT_INSTANT0("android_webview", 236 TRACE_EVENT_INSTANT0("android_webview",
229 "EarlyOut_EmptyVisibleRect", 237 "EarlyOut_EmptyVisibleRect",
230 TRACE_EVENT_SCOPE_THREAD); 238 TRACE_EVENT_SCOPE_THREAD);
231 shared_renderer_state_->SetForceInvalidateOnNextDrawGL(true); 239 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(true);
232 return client_->RequestDrawGL(java_canvas, false); 240 return client_->RequestDrawGL(java_canvas, false);
233 } 241 }
234 242
235 ReturnResourceFromParent(); 243 ReturnResourceFromParent();
236 if (shared_renderer_state_->HasCompositorFrame()) { 244 if (shared_renderer_state_.HasCompositorFrameOnUI()) {
237 TRACE_EVENT_INSTANT0("android_webview", 245 TRACE_EVENT_INSTANT0("android_webview",
238 "EarlyOut_PreviousFrameUnconsumed", 246 "EarlyOut_PreviousFrameUnconsumed",
239 TRACE_EVENT_SCOPE_THREAD); 247 TRACE_EVENT_SCOPE_THREAD);
240 DidSkipCompositeInDraw(); 248 DidSkipCompositeInDraw();
241 return client_->RequestDrawGL(java_canvas, false); 249 return client_->RequestDrawGL(java_canvas, false);
242 } 250 }
243 251
244 scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); 252 scoped_ptr<cc::CompositorFrame> frame = CompositeHw();
245 if (!frame.get()) 253 if (!frame.get())
246 return false; 254 return false;
247 255
248 shared_renderer_state_->SetCompositorFrame(frame.Pass(), false); 256 shared_renderer_state_.SetCompositorFrameOnUI(frame.Pass(), false);
249 GlobalTileManager::GetInstance()->DidUse(tile_manager_key_); 257 GlobalTileManager::GetInstance()->DidUse(tile_manager_key_);
250 return client_->RequestDrawGL(java_canvas, false); 258 return client_->RequestDrawGL(java_canvas, false);
251 } 259 }
252 260
253 scoped_ptr<cc::CompositorFrame> BrowserViewRenderer::CompositeHw() { 261 scoped_ptr<cc::CompositorFrame> BrowserViewRenderer::CompositeHw() {
254 SynchronousCompositorMemoryPolicy new_policy = CalculateDesiredMemoryPolicy(); 262 SynchronousCompositorMemoryPolicy new_policy = CalculateDesiredMemoryPolicy();
255 RequestMemoryPolicy(new_policy); 263 RequestMemoryPolicy(new_policy);
256 compositor_->SetMemoryPolicy(memory_policy_); 264 compositor_->SetMemoryPolicy(memory_policy_);
257 265
258 parent_draw_constraints_ = shared_renderer_state_->ParentDrawConstraints(); 266 parent_draw_constraints_ =
267 shared_renderer_state_.GetParentDrawConstraintsOnUI();
259 gfx::Size surface_size(width_, height_); 268 gfx::Size surface_size(width_, height_);
260 gfx::Rect viewport(surface_size); 269 gfx::Rect viewport(surface_size);
261 gfx::Rect clip = viewport; 270 gfx::Rect clip = viewport;
262 gfx::Transform transform_for_tile_priority = 271 gfx::Transform transform_for_tile_priority =
263 parent_draw_constraints_.transform; 272 parent_draw_constraints_.transform;
264 273
265 // If the WebView is on a layer, WebView does not know what transform is 274 // If the WebView is on a layer, WebView does not know what transform is
266 // applied onto the layer so global visible rect does not make sense here. 275 // applied onto the layer so global visible rect does not make sense here.
267 // In this case, just use the surface rect for tiling. 276 // In this case, just use the surface rect for tiling.
268 gfx::Rect viewport_rect_for_tile_priority; 277 gfx::Rect viewport_rect_for_tile_priority;
(...skipping 13 matching lines...) Expand all
282 transform_for_tile_priority); 291 transform_for_tile_priority);
283 if (frame.get()) 292 if (frame.get())
284 DidComposite(); 293 DidComposite();
285 return frame.Pass(); 294 return frame.Pass();
286 } 295 }
287 296
288 void BrowserViewRenderer::UpdateParentDrawConstraints() { 297 void BrowserViewRenderer::UpdateParentDrawConstraints() {
289 // Post an invalidate if the parent draw constraints are stale and there is 298 // Post an invalidate if the parent draw constraints are stale and there is
290 // no pending invalidate. 299 // no pending invalidate.
291 bool needs_force_invalidate = 300 bool needs_force_invalidate =
292 shared_renderer_state_->NeedsForceInvalidateOnNextDrawGL(); 301 shared_renderer_state_.NeedsForceInvalidateOnNextDrawGLOnUI();
293 if (needs_force_invalidate || 302 if (needs_force_invalidate ||
294 !parent_draw_constraints_.Equals( 303 !parent_draw_constraints_.Equals(
295 shared_renderer_state_->ParentDrawConstraints())) { 304 shared_renderer_state_.GetParentDrawConstraintsOnUI())) {
296 shared_renderer_state_->SetForceInvalidateOnNextDrawGL(false); 305 shared_renderer_state_.SetForceInvalidateOnNextDrawGLOnUI(false);
297 EnsureContinuousInvalidation(true, needs_force_invalidate); 306 EnsureContinuousInvalidation(true, needs_force_invalidate);
298 } 307 }
299 } 308 }
300 309
301 void BrowserViewRenderer::ReturnUnusedResource( 310 void BrowserViewRenderer::ReturnUnusedResource(
302 scoped_ptr<cc::CompositorFrame> frame) { 311 scoped_ptr<cc::CompositorFrame> frame) {
303 if (!frame.get()) 312 if (!frame.get())
304 return; 313 return;
305 314
306 cc::CompositorFrameAck frame_ack; 315 cc::CompositorFrameAck frame_ack;
307 cc::TransferableResource::ReturnResources( 316 cc::TransferableResource::ReturnResources(
308 frame->delegated_frame_data->resource_list, &frame_ack.resources); 317 frame->delegated_frame_data->resource_list, &frame_ack.resources);
309 if (compositor_ && !frame_ack.resources.empty()) 318 if (compositor_ && !frame_ack.resources.empty())
310 compositor_->ReturnResources(frame_ack); 319 compositor_->ReturnResources(frame_ack);
311 } 320 }
312 321
313 void BrowserViewRenderer::ReturnResourceFromParent() { 322 void BrowserViewRenderer::ReturnResourceFromParent() {
314 cc::CompositorFrameAck frame_ack; 323 cc::CompositorFrameAck frame_ack;
315 shared_renderer_state_->SwapReturnedResources(&frame_ack.resources); 324 shared_renderer_state_.SwapReturnedResourcesOnUI(&frame_ack.resources);
316 if (compositor_ && !frame_ack.resources.empty()) { 325 if (compositor_ && !frame_ack.resources.empty()) {
317 compositor_->ReturnResources(frame_ack); 326 compositor_->ReturnResources(frame_ack);
318 } 327 }
319 } 328 }
320 329
321 void BrowserViewRenderer::DidSkipCommitFrame() { 330 void BrowserViewRenderer::DidSkipCommitFrame() {
322 // Treat it the same way as skipping onDraw. 331 // Treat it the same way as skipping onDraw.
323 DidSkipCompositeInDraw(); 332 DidSkipCompositeInDraw();
324 } 333 }
325 334
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
438 } 447 }
439 448
440 void BrowserViewRenderer::OnDetachedFromWindow() { 449 void BrowserViewRenderer::OnDetachedFromWindow() {
441 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow"); 450 TRACE_EVENT0("android_webview", "BrowserViewRenderer::OnDetachedFromWindow");
442 attached_to_window_ = false; 451 attached_to_window_ = false;
443 DCHECK(!hardware_enabled_); 452 DCHECK(!hardware_enabled_);
444 } 453 }
445 454
446 void BrowserViewRenderer::ReleaseHardware() { 455 void BrowserViewRenderer::ReleaseHardware() {
447 DCHECK(hardware_enabled_); 456 DCHECK(hardware_enabled_);
448 ReturnUnusedResource(shared_renderer_state_->PassCompositorFrame()); 457 // TODO(hush): do this in somewhere else. Either in hardware render or in
458 // shared renderer state.
459 ReturnUnusedResource(shared_renderer_state_.PassCompositorFrame());
449 ReturnResourceFromParent(); 460 ReturnResourceFromParent();
450 DCHECK(shared_renderer_state_->ReturnedResourcesEmpty()); 461 DCHECK(shared_renderer_state_.ReturnedResourcesEmpty());
451 462
452 if (compositor_) { 463 if (compositor_) {
453 compositor_->ReleaseHwDraw(); 464 compositor_->ReleaseHwDraw();
454 SynchronousCompositorMemoryPolicy zero_policy; 465 SynchronousCompositorMemoryPolicy zero_policy;
455 RequestMemoryPolicy(zero_policy); 466 RequestMemoryPolicy(zero_policy);
456 } 467 }
457 468
458 hardware_enabled_ = false; 469 hardware_enabled_ = false;
459 GlobalTileManager::GetInstance()->Remove(tile_manager_key_); 470 GlobalTileManager::GetInstance()->Remove(tile_manager_key_);
460 } 471 }
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
737 "compositor_needs_continuous_invalidate_", 748 "compositor_needs_continuous_invalidate_",
738 compositor_needs_continuous_invalidate_); 749 compositor_needs_continuous_invalidate_);
739 750
740 // This should only be called if OnDraw or DrawGL did not come in time, which 751 // This should only be called if OnDraw or DrawGL did not come in time, which
741 // means block_invalidates_ must still be true. 752 // means block_invalidates_ must still be true.
742 DCHECK(block_invalidates_); 753 DCHECK(block_invalidates_);
743 fallback_tick_pending_ = false; 754 fallback_tick_pending_ = false;
744 if (compositor_needs_continuous_invalidate_ && compositor_) { 755 if (compositor_needs_continuous_invalidate_ && compositor_) {
745 if (hardware_enabled_) { 756 if (hardware_enabled_) {
746 ReturnResourceFromParent(); 757 ReturnResourceFromParent();
747 ReturnUnusedResource(shared_renderer_state_->PassCompositorFrame()); 758 ReturnUnusedResource(shared_renderer_state_.PassCompositorFrame());
748 scoped_ptr<cc::CompositorFrame> frame = CompositeHw(); 759 scoped_ptr<cc::CompositorFrame> frame = CompositeHw();
749 if (frame.get()) { 760 if (frame.get()) {
750 shared_renderer_state_->SetCompositorFrame(frame.Pass(), true); 761 shared_renderer_state_.SetCompositorFrameOnUI(frame.Pass(), true);
751 } 762 }
752 } else { 763 } else {
753 ForceFakeCompositeSW(); 764 ForceFakeCompositeSW();
754 } 765 }
755 } else { 766 } else {
756 // Pretend we just composited to unblock further invalidates. 767 // Pretend we just composited to unblock further invalidates.
757 DidComposite(); 768 DidComposite();
758 } 769 }
759 } 770 }
760 771
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
809 base::StringAppendF(&str, 820 base::StringAppendF(&str,
810 "overscroll_rounding_error_: %s ", 821 "overscroll_rounding_error_: %s ",
811 overscroll_rounding_error_.ToString().c_str()); 822 overscroll_rounding_error_.ToString().c_str());
812 base::StringAppendF( 823 base::StringAppendF(
813 &str, "on_new_picture_enable: %d ", on_new_picture_enable_); 824 &str, "on_new_picture_enable: %d ", on_new_picture_enable_);
814 base::StringAppendF(&str, "clear_view: %d ", clear_view_); 825 base::StringAppendF(&str, "clear_view: %d ", clear_view_);
815 return str; 826 return str;
816 } 827 }
817 828
818 } // namespace android_webview 829 } // namespace android_webview
OLDNEW
« no previous file with comments | « android_webview/browser/browser_view_renderer.h ('k') | android_webview/browser/hardware_renderer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698