| 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 |