| OLD | NEW | 
|---|
| 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 "config.h" | 5 #include "config.h" | 
| 6 | 6 | 
| 7 #include "CCThreadProxy.h" | 7 #include "CCThreadProxy.h" | 
| 8 | 8 | 
| 9 #include "CCDelayBasedTimeSource.h" | 9 #include "CCDelayBasedTimeSource.h" | 
| 10 #include "CCDrawQuad.h" | 10 #include "CCDrawQuad.h" | 
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 344     m_schedulerOnImplThread->setNeedsForcedCommit(); | 344     m_schedulerOnImplThread->setNeedsForcedCommit(); | 
| 345 } | 345 } | 
| 346 | 346 | 
| 347 void CCThreadProxy::postAnimationEventsToMainThreadOnImplThread(PassOwnPtr<CCAni
     mationEventsVector> events, double wallClockTime) | 347 void CCThreadProxy::postAnimationEventsToMainThreadOnImplThread(PassOwnPtr<CCAni
     mationEventsVector> events, double wallClockTime) | 
| 348 { | 348 { | 
| 349     ASSERT(isImplThread()); | 349     ASSERT(isImplThread()); | 
| 350     TRACE_EVENT0("cc", "CCThreadProxy::postAnimationEventsToMainThreadOnImplThre
     ad"); | 350     TRACE_EVENT0("cc", "CCThreadProxy::postAnimationEventsToMainThreadOnImplThre
     ad"); | 
| 351     m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadProxy::setAnim
     ationEvents, events, wallClockTime)); | 351     m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadProxy::setAnim
     ationEvents, events, wallClockTime)); | 
| 352 } | 352 } | 
| 353 | 353 | 
|  | 354 void CCThreadProxy::releaseContentsTexturesOnImplThread() | 
|  | 355 { | 
|  | 356     ASSERT(isImplThread()); | 
|  | 357     m_layerTreeHost->reduceContentsTexturesMemoryOnImplThread(0, m_layerTreeHost
     Impl->resourceProvider()); | 
|  | 358     // Make sure that we get a new commit before drawing again. | 
|  | 359     m_resetContentsTexturesPurgedAfterCommitOnImplThread = false; | 
|  | 360     // The texture upload queue may reference textures that were just purged, so
      clear it. | 
|  | 361     m_currentTextureUpdateControllerOnImplThread.clear(); | 
|  | 362 } | 
|  | 363 | 
| 354 void CCThreadProxy::setNeedsRedraw() | 364 void CCThreadProxy::setNeedsRedraw() | 
| 355 { | 365 { | 
| 356     ASSERT(isMainThread()); | 366     ASSERT(isMainThread()); | 
| 357     TRACE_EVENT0("cc", "CCThreadProxy::setNeedsRedraw"); | 367     TRACE_EVENT0("cc", "CCThreadProxy::setNeedsRedraw"); | 
| 358     CCProxy::implThread()->postTask(createCCThreadTask(this, &CCThreadProxy::set
     FullRootLayerDamageOnImplThread)); | 368     CCProxy::implThread()->postTask(createCCThreadTask(this, &CCThreadProxy::set
     FullRootLayerDamageOnImplThread)); | 
| 359     CCProxy::implThread()->postTask(createCCThreadTask(this, &CCThreadProxy::set
     NeedsRedrawOnImplThread)); | 369     CCProxy::implThread()->postTask(createCCThreadTask(this, &CCThreadProxy::set
     NeedsRedrawOnImplThread)); | 
| 360 } | 370 } | 
| 361 | 371 | 
| 362 bool CCThreadProxy::commitRequested() const | 372 bool CCThreadProxy::commitRequested() const | 
| 363 { | 373 { | 
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 446     setNeedsForcedCommitOnImplThread(); | 456     setNeedsForcedCommitOnImplThread(); | 
| 447 } | 457 } | 
| 448 | 458 | 
| 449 void CCThreadProxy::scheduledActionBeginFrame() | 459 void CCThreadProxy::scheduledActionBeginFrame() | 
| 450 { | 460 { | 
| 451     TRACE_EVENT0("cc", "CCThreadProxy::scheduledActionBeginFrame"); | 461     TRACE_EVENT0("cc", "CCThreadProxy::scheduledActionBeginFrame"); | 
| 452     ASSERT(!m_pendingBeginFrameRequest); | 462     ASSERT(!m_pendingBeginFrameRequest); | 
| 453     m_pendingBeginFrameRequest = adoptPtr(new BeginFrameAndCommitState()); | 463     m_pendingBeginFrameRequest = adoptPtr(new BeginFrameAndCommitState()); | 
| 454     m_pendingBeginFrameRequest->monotonicFrameBeginTime = monotonicallyIncreasin
     gTime(); | 464     m_pendingBeginFrameRequest->monotonicFrameBeginTime = monotonicallyIncreasin
     gTime(); | 
| 455     m_pendingBeginFrameRequest->scrollInfo = m_layerTreeHostImpl->processScrollD
     eltas(); | 465     m_pendingBeginFrameRequest->scrollInfo = m_layerTreeHostImpl->processScrollD
     eltas(); | 
| 456     m_pendingBeginFrameRequest->contentsTexturesWereDeleted = m_layerTreeHostImp
     l->contentsTexturesPurged(); |  | 
| 457     m_pendingBeginFrameRequest->memoryAllocationLimitBytes = m_layerTreeHostImpl
     ->memoryAllocationLimitBytes(); | 466     m_pendingBeginFrameRequest->memoryAllocationLimitBytes = m_layerTreeHostImpl
     ->memoryAllocationLimitBytes(); | 
|  | 467     m_layerTreeHost->getEvictedContentTexturesBackings(m_pendingBeginFrameReques
     t->evictedContentsTexturesBackings); | 
| 458 | 468 | 
| 459     m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadProxy::beginFr
     ame)); | 469     m_mainThreadProxy->postTask(createCCThreadTask(this, &CCThreadProxy::beginFr
     ame)); | 
| 460 | 470 | 
| 461     if (m_beginFrameCompletionEventOnImplThread) { | 471     if (m_beginFrameCompletionEventOnImplThread) { | 
| 462         m_beginFrameCompletionEventOnImplThread->signal(); | 472         m_beginFrameCompletionEventOnImplThread->signal(); | 
| 463         m_beginFrameCompletionEventOnImplThread = 0; | 473         m_beginFrameCompletionEventOnImplThread = 0; | 
| 464     } | 474     } | 
| 465 } | 475 } | 
| 466 | 476 | 
| 467 void CCThreadProxy::beginFrame() | 477 void CCThreadProxy::beginFrame() | 
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 518     // updateLayers. | 528     // updateLayers. | 
| 519     m_commitRequested = false; | 529     m_commitRequested = false; | 
| 520     m_commitRequestSentToImplThread = false; | 530     m_commitRequestSentToImplThread = false; | 
| 521     m_forcedCommitRequested = false; | 531     m_forcedCommitRequested = false; | 
| 522 | 532 | 
| 523     if (!m_layerTreeHost->initializeRendererIfNeeded()) { | 533     if (!m_layerTreeHost->initializeRendererIfNeeded()) { | 
| 524         TRACE_EVENT0("cc", "EarlyOut_InitializeFailed"); | 534         TRACE_EVENT0("cc", "EarlyOut_InitializeFailed"); | 
| 525         return; | 535         return; | 
| 526     } | 536     } | 
| 527 | 537 | 
| 528     if (request->contentsTexturesWereDeleted) | 538     m_layerTreeHost->unlinkEvictedContentTexturesBackings(request->evictedConten
     tsTexturesBackings); | 
| 529         m_layerTreeHost->unlinkAllContentTextures(); |  | 
| 530 | 539 | 
| 531     OwnPtr<CCTextureUpdateQueue> queue = adoptPtr(new CCTextureUpdateQueue); | 540     OwnPtr<CCTextureUpdateQueue> queue = adoptPtr(new CCTextureUpdateQueue); | 
| 532     m_layerTreeHost->updateLayers(*(queue.get()), request->memoryAllocationLimit
     Bytes); | 541     m_layerTreeHost->updateLayers(*(queue.get()), request->memoryAllocationLimit
     Bytes); | 
| 533 | 542 | 
| 534     // Once single buffered layers are committed, they cannot be modified until | 543     // Once single buffered layers are committed, they cannot be modified until | 
| 535     // they are drawn by the impl thread. | 544     // they are drawn by the impl thread. | 
| 536     m_texturesAcquired = false; | 545     m_texturesAcquired = false; | 
| 537 | 546 | 
| 538     m_layerTreeHost->willCommit(); | 547     m_layerTreeHost->willCommit(); | 
| 539     // Before applying scrolls and calling animate, we set m_animateRequested to | 548     // Before applying scrolls and calling animate, we set m_animateRequested to | 
| 540     // false. If it is true now, it means setNeedAnimate was called again, but | 549     // false. If it is true now, it means setNeedAnimate was called again, but | 
| 541     // during a state when m_commitRequestSentToImplThread = true. We need to | 550     // during a state when m_commitRequestSentToImplThread = true. We need to | 
| 542     // force that call to happen again now so that the commit request is sent to | 551     // force that call to happen again now so that the commit request is sent to | 
| 543     // the impl thread. | 552     // the impl thread. | 
| 544     if (m_animateRequested) { | 553     if (m_animateRequested) { | 
| 545         // Forces setNeedsAnimate to consider posting a commit task. | 554         // Forces setNeedsAnimate to consider posting a commit task. | 
| 546         m_animateRequested = false; | 555         m_animateRequested = false; | 
| 547         setNeedsAnimate(); | 556         setNeedsAnimate(); | 
| 548     } | 557     } | 
| 549 | 558 | 
| 550     // Notify the impl thread that the beginFrame has completed. This will | 559     // Notify the impl thread that the beginFrame has completed. This will | 
| 551     // begin the commit process, which is blocking from the main thread's | 560     // begin the commit process, which is blocking from the main thread's | 
| 552     // point of view, but asynchronously performed on the impl thread, | 561     // point of view, but asynchronously performed on the impl thread, | 
| 553     // coordinated by the CCScheduler. | 562     // coordinated by the CCScheduler. | 
| 554     { | 563     { | 
| 555         TRACE_EVENT0("cc", "commit"); | 564         TRACE_EVENT0("cc", "commit"); | 
| 556         DebugScopedSetMainThreadBlocked mainThreadBlocked; | 565         DebugScopedSetMainThreadBlocked mainThreadBlocked; | 
| 557 | 566 | 
| 558         CCCompletionEvent completion; | 567         CCCompletionEvent completion; | 
| 559         CCProxy::implThread()->postTask(createCCThreadTask(this, &CCThreadProxy:
     :beginFrameCompleteOnImplThread, &completion, queue.release(), request->contents
     TexturesWereDeleted)); | 568         CCProxy::implThread()->postTask(createCCThreadTask(this, &CCThreadProxy:
     :beginFrameCompleteOnImplThread, &completion, queue.release())); | 
| 560         completion.wait(); | 569         completion.wait(); | 
| 561     } | 570     } | 
| 562 | 571 | 
| 563     m_layerTreeHost->commitComplete(); | 572     m_layerTreeHost->commitComplete(); | 
| 564     m_layerTreeHost->didBeginFrame(); | 573     m_layerTreeHost->didBeginFrame(); | 
| 565 } | 574 } | 
| 566 | 575 | 
| 567 void CCThreadProxy::beginFrameCompleteOnImplThread(CCCompletionEvent* completion
     , PassOwnPtr<CCTextureUpdateQueue> queue, bool contentsTexturesWereDeleted) | 576 void CCThreadProxy::beginFrameCompleteOnImplThread(CCCompletionEvent* completion
     , PassOwnPtr<CCTextureUpdateQueue> queue) | 
| 568 { | 577 { | 
| 569     TRACE_EVENT0("cc", "CCThreadProxy::beginFrameCompleteOnImplThread"); | 578     TRACE_EVENT0("cc", "CCThreadProxy::beginFrameCompleteOnImplThread"); | 
| 570     ASSERT(!m_commitCompletionEventOnImplThread); | 579     ASSERT(!m_commitCompletionEventOnImplThread); | 
| 571     ASSERT(isImplThread() && isMainThreadBlocked()); | 580     ASSERT(isImplThread() && isMainThreadBlocked()); | 
| 572     ASSERT(m_schedulerOnImplThread); | 581     ASSERT(m_schedulerOnImplThread); | 
| 573     ASSERT(m_schedulerOnImplThread->commitPending()); | 582     ASSERT(m_schedulerOnImplThread->commitPending()); | 
| 574 | 583 | 
| 575     if (!m_layerTreeHostImpl) { | 584     if (!m_layerTreeHostImpl) { | 
| 576         TRACE_EVENT0("cc", "EarlyOut_NoLayerTree"); | 585         TRACE_EVENT0("cc", "EarlyOut_NoLayerTree"); | 
| 577         completion->signal(); | 586         completion->signal(); | 
| 578         return; | 587         return; | 
| 579     } | 588     } | 
| 580 | 589 | 
| 581     if (contentsTexturesWereDeleted) { | 590     // If we unlinked evicted textures on the main thread, delete them now. | 
| 582         ASSERT(m_layerTreeHostImpl->contentsTexturesPurged()); | 591     if (m_layerTreeHost->deleteEvictedContentTexturesBackings()) { | 
| 583         // We unlinked all textures on the main thread, delete them now. | 592 | 
| 584         m_layerTreeHost->deleteUnlinkedTextures(); | 593         // Deleting the evicted textures' backings resulted in some textures in 
     the | 
| 585         // Mark that we can start drawing again when this commit is complete. | 594         // layer tree being invalidated (unliked from their backings). The uploa
     d queue | 
| 586         m_resetContentsTexturesPurgedAfterCommitOnImplThread = true; | 595         // may contain references to these textures, so clear the queue and kick
      off | 
| 587     } else if (m_layerTreeHostImpl->contentsTexturesPurged()) { | 596         // another commit to fill them again. | 
| 588         // We purged the content textures on the impl thread between the time we |  | 
| 589         // posted the beginFrame task and now, meaning we have a bunch of |  | 
| 590         // uploads that are now invalid. Clear the uploads (they all go to |  | 
| 591         // content textures), and kick another commit to fill them again. |  | 
| 592         queue->clearUploads(); | 597         queue->clearUploads(); | 
| 593         setNeedsCommitOnImplThread(); | 598         setNeedsCommitOnImplThread(); | 
|  | 599     } else { | 
|  | 600         // The layer tree does not reference evicted textures, so mark that we | 
|  | 601         // can draw this tree once this commit is complete. | 
|  | 602         if (m_layerTreeHostImpl->contentsTexturesPurged()) | 
|  | 603             m_resetContentsTexturesPurgedAfterCommitOnImplThread = true; | 
| 594     } | 604     } | 
| 595 | 605 | 
| 596     bool hasResourceUpdates = queue->hasMoreUpdates(); | 606     bool hasResourceUpdates = queue->hasMoreUpdates(); | 
| 597     if (hasResourceUpdates) | 607     if (hasResourceUpdates) | 
| 598         m_currentTextureUpdateControllerOnImplThread = CCTextureUpdateController
     ::create(this, CCProxy::implThread(), queue, m_layerTreeHostImpl->resourceProvid
     er(), m_layerTreeHostImpl->renderer()->textureCopier(), m_layerTreeHostImpl->ren
     derer()->textureUploader()); | 608         m_currentTextureUpdateControllerOnImplThread = CCTextureUpdateController
     ::create(this, CCProxy::implThread(), queue, m_layerTreeHostImpl->resourceProvid
     er(), m_layerTreeHostImpl->renderer()->textureCopier(), m_layerTreeHostImpl->ren
     derer()->textureUploader()); | 
| 599     m_commitCompletionEventOnImplThread = completion; | 609     m_commitCompletionEventOnImplThread = completion; | 
| 600 | 610 | 
| 601     m_schedulerOnImplThread->beginFrameComplete(hasResourceUpdates); | 611     m_schedulerOnImplThread->beginFrameComplete(hasResourceUpdates); | 
| 602 } | 612 } | 
| 603 | 613 | 
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 872                 capabilities->usingSwapCompleteCallback); | 882                 capabilities->usingSwapCompleteCallback); | 
| 873     } | 883     } | 
| 874 | 884 | 
| 875     completion->signal(); | 885     completion->signal(); | 
| 876 } | 886 } | 
| 877 | 887 | 
| 878 void CCThreadProxy::layerTreeHostClosedOnImplThread(CCCompletionEvent* completio
     n) | 888 void CCThreadProxy::layerTreeHostClosedOnImplThread(CCCompletionEvent* completio
     n) | 
| 879 { | 889 { | 
| 880     TRACE_EVENT0("cc", "CCThreadProxy::layerTreeHostClosedOnImplThread"); | 890     TRACE_EVENT0("cc", "CCThreadProxy::layerTreeHostClosedOnImplThread"); | 
| 881     ASSERT(isImplThread()); | 891     ASSERT(isImplThread()); | 
| 882     if (!m_layerTreeHostImpl->contentsTexturesPurged()) | 892     m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostImpl->res
     ourceProvider()); | 
| 883         m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostImpl-
     >resourceProvider()); |  | 
| 884     m_inputHandlerOnImplThread.clear(); | 893     m_inputHandlerOnImplThread.clear(); | 
| 885     m_layerTreeHostImpl.clear(); | 894     m_layerTreeHostImpl.clear(); | 
| 886     m_schedulerOnImplThread.clear(); | 895     m_schedulerOnImplThread.clear(); | 
| 887     completion->signal(); | 896     completion->signal(); | 
| 888 } | 897 } | 
| 889 | 898 | 
| 890 void CCThreadProxy::setFullRootLayerDamageOnImplThread() | 899 void CCThreadProxy::setFullRootLayerDamageOnImplThread() | 
| 891 { | 900 { | 
| 892     ASSERT(isImplThread()); | 901     ASSERT(isImplThread()); | 
| 893     m_layerTreeHostImpl->setFullRootLayerDamage(); | 902     m_layerTreeHostImpl->setFullRootLayerDamage(); | 
| 894 } | 903 } | 
| 895 | 904 | 
| 896 size_t CCThreadProxy::maxPartialTextureUpdates() const | 905 size_t CCThreadProxy::maxPartialTextureUpdates() const | 
| 897 { | 906 { | 
| 898     return CCTextureUpdateController::maxPartialTextureUpdates(); | 907     return CCTextureUpdateController::maxPartialTextureUpdates(); | 
| 899 } | 908 } | 
| 900 | 909 | 
| 901 void CCThreadProxy::recreateContextOnImplThread(CCCompletionEvent* completion, C
     CGraphicsContext* contextPtr, bool* recreateSucceeded, RendererCapabilities* cap
     abilities) | 910 void CCThreadProxy::recreateContextOnImplThread(CCCompletionEvent* completion, C
     CGraphicsContext* contextPtr, bool* recreateSucceeded, RendererCapabilities* cap
     abilities) | 
| 902 { | 911 { | 
| 903     TRACE_EVENT0("cc", "CCThreadProxy::recreateContextOnImplThread"); | 912     TRACE_EVENT0("cc", "CCThreadProxy::recreateContextOnImplThread"); | 
| 904     ASSERT(isImplThread()); | 913     ASSERT(isImplThread()); | 
| 905     if (!m_layerTreeHostImpl->contentsTexturesPurged()) | 914     m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostImpl->res
     ourceProvider()); | 
| 906         m_layerTreeHost->deleteContentsTexturesOnImplThread(m_layerTreeHostImpl-
     >resourceProvider()); |  | 
| 907     *recreateSucceeded = m_layerTreeHostImpl->initializeRenderer(adoptPtr(contex
     tPtr), textureUploader); | 915     *recreateSucceeded = m_layerTreeHostImpl->initializeRenderer(adoptPtr(contex
     tPtr), textureUploader); | 
| 908     if (*recreateSucceeded) { | 916     if (*recreateSucceeded) { | 
| 909         *capabilities = m_layerTreeHostImpl->rendererCapabilities(); | 917         *capabilities = m_layerTreeHostImpl->rendererCapabilities(); | 
| 910         m_schedulerOnImplThread->didRecreateContext(); | 918         m_schedulerOnImplThread->didRecreateContext(); | 
| 911     } | 919     } | 
| 912     completion->signal(); | 920     completion->signal(); | 
| 913 } | 921 } | 
| 914 | 922 | 
| 915 void CCThreadProxy::implSideRenderingStatsOnImplThread(CCCompletionEvent* comple
     tion, CCRenderingStats* stats) | 923 void CCThreadProxy::implSideRenderingStatsOnImplThread(CCCompletionEvent* comple
     tion, CCRenderingStats* stats) | 
| 916 { | 924 { | 
| 917     ASSERT(isImplThread()); | 925     ASSERT(isImplThread()); | 
| 918     m_layerTreeHostImpl->renderingStats(*stats); | 926     m_layerTreeHostImpl->renderingStats(*stats); | 
| 919     completion->signal(); | 927     completion->signal(); | 
| 920 } | 928 } | 
| 921 | 929 | 
| 922 } // namespace cc | 930 } // namespace cc | 
| OLD | NEW | 
|---|