| Index: cc/thread_proxy.cc
|
| diff --git a/cc/thread_proxy.cc b/cc/thread_proxy.cc
|
| index fe92817ea58a659061e98380f4953a1c5dd5043c..21c826ce01cb9a045c9f09d0dfdcff23f6fe71a0 100644
|
| --- a/cc/thread_proxy.cc
|
| +++ b/cc/thread_proxy.cc
|
| @@ -29,6 +29,9 @@ const double contextRecreationTickRate = 0.03;
|
| // Measured in seconds.
|
| const double smoothnessTakesPriorityExpirationDelay = 0.25;
|
|
|
| +// Measured in seconds.
|
| +const double checkForCompletedRasterTasksDelay = 0.004;
|
| +
|
| } // namespace
|
|
|
| namespace cc {
|
| @@ -51,6 +54,8 @@ ThreadProxy::ThreadProxy(LayerTreeHost* layerTreeHost, scoped_ptr<Thread> implTh
|
| , m_manageTilesPending(false)
|
| , m_weakFactoryOnImplThread(ALLOW_THIS_IN_INITIALIZER_LIST(this))
|
| , m_weakFactory(ALLOW_THIS_IN_INITIALIZER_LIST(this))
|
| + , m_weakCheckForCompletedRasterTasksFactory(
|
| + ALLOW_THIS_IN_INITIALIZER_LIST(this))
|
| , m_beginFrameCompletionEventOnImplThread(0)
|
| , m_readbackRequestOnImplThread(0)
|
| , m_commitCompletionEventOnImplThread(0)
|
| @@ -62,6 +67,7 @@ ThreadProxy::ThreadProxy(LayerTreeHost* layerTreeHost, scoped_ptr<Thread> implTh
|
| , m_totalCommitCount(0)
|
| , m_deferCommits(false)
|
| , m_renewTreePriorityOnImplThreadPending(false)
|
| + , m_checkForCompletedRasterTasksPending(false)
|
| {
|
| TRACE_EVENT0("cc", "ThreadProxy::ThreadProxy");
|
| DCHECK(isMainThread());
|
| @@ -355,6 +361,7 @@ void ThreadProxy::setNeedsCommitOnImplThread()
|
|
|
| void ThreadProxy::setNeedsManageTilesOnImplThread()
|
| {
|
| + DCHECK(isImplThread());
|
| if (m_manageTilesPending)
|
| return;
|
| Proxy::implThread()->postTask(base::Bind(&ThreadProxy::manageTilesOnImplThread, m_implThreadWeakPtr));
|
| @@ -363,12 +370,33 @@ void ThreadProxy::setNeedsManageTilesOnImplThread()
|
|
|
| void ThreadProxy::manageTilesOnImplThread()
|
| {
|
| + DCHECK(isImplThread());
|
| // TODO(nduca): If needed, move this into CCSchedulerStateMachine.
|
| m_manageTilesPending = false;
|
| if (m_layerTreeHostImpl)
|
| m_layerTreeHostImpl->manageTiles();
|
| }
|
|
|
| +void ThreadProxy::setNeedsCheckForCompletedRasterTasksOnImplThread()
|
| +{
|
| + DCHECK(isImplThread());
|
| + if (m_checkForCompletedRasterTasksPending)
|
| + return;
|
| + Proxy::implThread()->postDelayedTask(
|
| + base::Bind(&ThreadProxy::checkForCompletedRasterTasksOnImplThread,
|
| + m_weakCheckForCompletedRasterTasksFactory.GetWeakPtr()),
|
| + checkForCompletedRasterTasksDelay * 1000);
|
| + m_checkForCompletedRasterTasksPending = true;
|
| +}
|
| +
|
| +void ThreadProxy::checkForCompletedRasterTasksOnImplThread()
|
| +{
|
| + DCHECK(isImplThread());
|
| + m_checkForCompletedRasterTasksPending = false;
|
| + if (m_layerTreeHostImpl)
|
| + m_layerTreeHostImpl->checkForCompletedRasterTasks();
|
| +}
|
| +
|
| void ThreadProxy::setNeedsForcedCommitOnImplThread()
|
| {
|
| DCHECK(isImplThread());
|
| @@ -486,6 +514,20 @@ void ThreadProxy::didUploadVisibleHighResolutionTileOnImplThread()
|
| m_schedulerOnImplThread->setNeedsRedraw();
|
| }
|
|
|
| +void ThreadProxy::didDetectIdleRasterOnImplThread()
|
| +{
|
| + DCHECK(isImplThread());
|
| + TRACE_EVENT0("cc", "ThreadProxy::didDetectIdleRasterOnImplThread");
|
| +
|
| + // Cancel pending check.
|
| + m_weakCheckForCompletedRasterTasksFactory.InvalidateWeakPtrs();
|
| + m_checkForCompletedRasterTasksPending = false;
|
| +
|
| + // Perform immediate check.
|
| + if (m_layerTreeHostImpl)
|
| + m_layerTreeHostImpl->checkForCompletedRasterTasks();
|
| +}
|
| +
|
| void ThreadProxy::mainThreadHasStoppedFlinging()
|
| {
|
| if (m_inputHandlerOnImplThread)
|
| @@ -1045,6 +1087,7 @@ void ThreadProxy::layerTreeHostClosedOnImplThread(CompletionEvent* completion)
|
| m_layerTreeHostImpl.reset();
|
| m_schedulerOnImplThread.reset();
|
| m_weakFactoryOnImplThread.InvalidateWeakPtrs();
|
| + m_weakCheckForCompletedRasterTasksFactory.InvalidateWeakPtrs();
|
| completion->signal();
|
| }
|
|
|
|
|