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

Side by Side Diff: cc/trees/thread_proxy.cc

Issue 307023002: cc: Use delayed unique notifier for renewing tree priority. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « cc/trees/thread_proxy.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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 "cc/trees/thread_proxy.h" 5 #include "cc/trees/thread_proxy.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/auto_reset.h" 10 #include "base/auto_reset.h"
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
109 int layer_tree_host_id) 109 int layer_tree_host_id)
110 : layer_tree_host_id(layer_tree_host_id), 110 : layer_tree_host_id(layer_tree_host_id),
111 contents_texture_manager(NULL), 111 contents_texture_manager(NULL),
112 commit_completion_event(NULL), 112 commit_completion_event(NULL),
113 completion_event_for_commit_held_on_tree_activation(NULL), 113 completion_event_for_commit_held_on_tree_activation(NULL),
114 next_frame_is_newly_committed_frame(false), 114 next_frame_is_newly_committed_frame(false),
115 inside_draw(false), 115 inside_draw(false),
116 input_throttled_until_commit(false), 116 input_throttled_until_commit(false),
117 animations_frozen_until_next_draw(false), 117 animations_frozen_until_next_draw(false),
118 did_commit_after_animating(false), 118 did_commit_after_animating(false),
119 renew_tree_priority_pending(false), 119 smoothness_priority_expiration_notifier(
120 proxy->ImplThreadTaskRunner(),
121 base::Bind(&ThreadProxy::RenewTreePriority, base::Unretained(proxy)),
122 base::TimeDelta::FromMilliseconds(
123 kSmoothnessTakesPriorityExpirationDelay * 1000)),
120 weak_factory(proxy) { 124 weak_factory(proxy) {
121 } 125 }
122 126
123 ThreadProxy::CompositorThreadOnly::~CompositorThreadOnly() {} 127 ThreadProxy::CompositorThreadOnly::~CompositorThreadOnly() {}
124 128
125 ThreadProxy::~ThreadProxy() { 129 ThreadProxy::~ThreadProxy() {
126 TRACE_EVENT0("cc", "ThreadProxy::~ThreadProxy"); 130 TRACE_EVENT0("cc", "ThreadProxy::~ThreadProxy");
127 DCHECK(IsMainThread()); 131 DCHECK(IsMainThread());
128 DCHECK(!main().started); 132 DCHECK(!main().started);
129 } 133 }
(...skipping 1264 matching lines...) Expand 10 before | Expand all | Expand 10 after
1394 } 1398 }
1395 1399
1396 void ThreadProxy::RenewTreePriority() { 1400 void ThreadProxy::RenewTreePriority() {
1397 DCHECK(IsImplThread()); 1401 DCHECK(IsImplThread());
1398 bool smoothness_takes_priority = 1402 bool smoothness_takes_priority =
1399 impl().layer_tree_host_impl->pinch_gesture_active() || 1403 impl().layer_tree_host_impl->pinch_gesture_active() ||
1400 impl().layer_tree_host_impl->page_scale_animation_active() || 1404 impl().layer_tree_host_impl->page_scale_animation_active() ||
1401 (impl().layer_tree_host_impl->IsCurrentlyScrolling() && 1405 (impl().layer_tree_host_impl->IsCurrentlyScrolling() &&
1402 !impl().layer_tree_host_impl->scroll_affects_scroll_handler()); 1406 !impl().layer_tree_host_impl->scroll_affects_scroll_handler());
1403 1407
1404 base::TimeTicks now = impl().layer_tree_host_impl->CurrentFrameTimeTicks(); 1408 // Schedule expiration if smoothness currently takes priority.
1405 1409 if (smoothness_takes_priority)
1406 // Update expiration time if smoothness currently takes priority. 1410 impl().smoothness_priority_expiration_notifier.Schedule();
1407 if (smoothness_takes_priority) {
1408 impl().smoothness_takes_priority_expiration_time =
1409 now + base::TimeDelta::FromMilliseconds(
1410 kSmoothnessTakesPriorityExpirationDelay * 1000);
1411 }
1412 1411
1413 // We use the same priority for both trees by default. 1412 // We use the same priority for both trees by default.
1414 TreePriority priority = SAME_PRIORITY_FOR_BOTH_TREES; 1413 TreePriority priority = SAME_PRIORITY_FOR_BOTH_TREES;
1415 1414
1416 // Smoothness takes priority if expiration time is in the future. 1415 // Smoothness takes priority if we have an expiration for it scheduled.
1417 if (impl().smoothness_takes_priority_expiration_time > now) 1416 if (impl().smoothness_priority_expiration_notifier.HasPendingNotification())
1418 priority = SMOOTHNESS_TAKES_PRIORITY; 1417 priority = SMOOTHNESS_TAKES_PRIORITY;
1419 1418
1420 // New content always takes priority when the active tree has 1419 // New content always takes priority when the active tree has
1421 // evicted resources or there is an invalid viewport size. 1420 // evicted resources or there is an invalid viewport size.
1422 if (impl().layer_tree_host_impl->active_tree()->ContentsTexturesPurged() || 1421 if (impl().layer_tree_host_impl->active_tree()->ContentsTexturesPurged() ||
1423 impl().layer_tree_host_impl->active_tree()->ViewportSizeInvalid() || 1422 impl().layer_tree_host_impl->active_tree()->ViewportSizeInvalid() ||
1424 impl().layer_tree_host_impl->EvictedUIResourcesExist() || 1423 impl().layer_tree_host_impl->EvictedUIResourcesExist() ||
1425 impl().input_throttled_until_commit) { 1424 impl().input_throttled_until_commit) {
1426 // Once we enter NEW_CONTENTS_TAKES_PRIORITY mode, visible tiles on active 1425 // Once we enter NEW_CONTENTS_TAKES_PRIORITY mode, visible tiles on active
1427 // tree might be freed. We need to set RequiresHighResToDraw to ensure that 1426 // tree might be freed. We need to set RequiresHighResToDraw to ensure that
1428 // high res tiles will be required to activate pending tree. 1427 // high res tiles will be required to activate pending tree.
1429 impl().layer_tree_host_impl->active_tree()->SetRequiresHighResToDraw(); 1428 impl().layer_tree_host_impl->active_tree()->SetRequiresHighResToDraw();
1430 priority = NEW_CONTENT_TAKES_PRIORITY; 1429 priority = NEW_CONTENT_TAKES_PRIORITY;
1431 } 1430 }
1432 1431
1433 impl().layer_tree_host_impl->SetTreePriority(priority); 1432 impl().layer_tree_host_impl->SetTreePriority(priority);
1434 impl().scheduler->SetSmoothnessTakesPriority(priority == 1433 impl().scheduler->SetSmoothnessTakesPriority(priority ==
1435 SMOOTHNESS_TAKES_PRIORITY); 1434 SMOOTHNESS_TAKES_PRIORITY);
1436 1435
1437 // Notify the the client of this compositor via the output surface. 1436 // Notify the the client of this compositor via the output surface.
1438 // TODO(epenner): Route this to compositor-thread instead of output-surface 1437 // TODO(epenner): Route this to compositor-thread instead of output-surface
1439 // after GTFO refactor of compositor-thread (http://crbug/170828). 1438 // after GTFO refactor of compositor-thread (http://crbug/170828).
1440 if (impl().layer_tree_host_impl->output_surface()) { 1439 if (impl().layer_tree_host_impl->output_surface()) {
1441 impl() 1440 impl()
1442 .layer_tree_host_impl->output_surface() 1441 .layer_tree_host_impl->output_surface()
1443 ->UpdateSmoothnessTakesPriority(priority == SMOOTHNESS_TAKES_PRIORITY); 1442 ->UpdateSmoothnessTakesPriority(priority == SMOOTHNESS_TAKES_PRIORITY);
1444 } 1443 }
1445
1446 base::TimeDelta delay =
1447 impl().smoothness_takes_priority_expiration_time - now;
1448
1449 // Need to make sure a delayed task is posted when we have smoothness
1450 // takes priority expiration time in the future.
1451 if (delay <= base::TimeDelta())
1452 return;
1453 if (impl().renew_tree_priority_pending)
1454 return;
1455
1456 Proxy::ImplThreadTaskRunner()->PostDelayedTask(
1457 FROM_HERE,
1458 base::Bind(&ThreadProxy::RenewTreePriorityOnImplThread,
1459 impl_thread_weak_ptr_),
1460 delay);
1461
1462 impl().renew_tree_priority_pending = true;
1463 }
1464
1465 void ThreadProxy::RenewTreePriorityOnImplThread() {
1466 DCHECK(impl().renew_tree_priority_pending);
1467 impl().renew_tree_priority_pending = false;
1468
1469 RenewTreePriority();
1470 } 1444 }
1471 1445
1472 void ThreadProxy::PostDelayedScrollbarFadeOnImplThread( 1446 void ThreadProxy::PostDelayedScrollbarFadeOnImplThread(
1473 const base::Closure& start_fade, 1447 const base::Closure& start_fade,
1474 base::TimeDelta delay) { 1448 base::TimeDelta delay) {
1475 Proxy::ImplThreadTaskRunner()->PostDelayedTask(FROM_HERE, start_fade, delay); 1449 Proxy::ImplThreadTaskRunner()->PostDelayedTask(FROM_HERE, start_fade, delay);
1476 } 1450 }
1477 1451
1478 void ThreadProxy::DidActivatePendingTree() { 1452 void ThreadProxy::DidActivatePendingTree() {
1479 TRACE_EVENT0("cc", "ThreadProxy::DidActivatePendingTreeOnImplThread"); 1453 TRACE_EVENT0("cc", "ThreadProxy::DidActivatePendingTreeOnImplThread");
(...skipping 12 matching lines...) Expand all
1492 1466
1493 impl().timing_history.DidActivatePendingTree(); 1467 impl().timing_history.DidActivatePendingTree();
1494 } 1468 }
1495 1469
1496 void ThreadProxy::DidManageTiles() { 1470 void ThreadProxy::DidManageTiles() {
1497 DCHECK(IsImplThread()); 1471 DCHECK(IsImplThread());
1498 impl().scheduler->DidManageTiles(); 1472 impl().scheduler->DidManageTiles();
1499 } 1473 }
1500 1474
1501 } // namespace cc 1475 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/thread_proxy.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698