| Index: cc/CCTextureUpdateController.cpp
|
| diff --git a/cc/CCTextureUpdateController.cpp b/cc/CCTextureUpdateController.cpp
|
| index 25d41cca581bb25b83adb03ad0fbf5172fee4c23..ca49d77ff3c554b013865350d5808228724468a1 100644
|
| --- a/cc/CCTextureUpdateController.cpp
|
| +++ b/cc/CCTextureUpdateController.cpp
|
| @@ -92,8 +92,9 @@ void CCTextureUpdateController::updateTextures(CCResourceProvider* resourceProvi
|
| copier->flush();
|
| }
|
|
|
| -CCTextureUpdateController::CCTextureUpdateController(CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
|
| - : m_timer(adoptPtr(new CCTimer(thread, this)))
|
| +CCTextureUpdateController::CCTextureUpdateController(CCTextureUpdateControllerClient* client, CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader)
|
| + : m_client(client)
|
| + , m_timer(adoptPtr(new CCTimer(thread, this)))
|
| , m_queue(queue)
|
| , m_resourceProvider(resourceProvider)
|
| , m_copier(copier)
|
| @@ -107,23 +108,24 @@ CCTextureUpdateController::~CCTextureUpdateController()
|
| {
|
| }
|
|
|
| -bool CCTextureUpdateController::hasMoreUpdates() const
|
| -{
|
| - return m_queue->hasMoreUpdates();
|
| -}
|
| -
|
| void CCTextureUpdateController::updateMoreTextures(double monotonicTimeLimit)
|
| {
|
| + ASSERT(monotonicTimeLimit >= m_monotonicTimeLimit);
|
| m_monotonicTimeLimit = monotonicTimeLimit;
|
|
|
| - if (!m_queue->hasMoreUpdates())
|
| + // Update already in progress.
|
| + if (m_timer->isActive())
|
| return;
|
|
|
| // Call updateMoreTexturesNow() directly unless it's the first update
|
| // attempt. This ensures that we empty the update queue in a finite
|
| // amount of time.
|
| if (m_firstUpdateAttempt) {
|
| - updateMoreTexturesIfEnoughTimeRemaining();
|
| + // Post a 0-delay task when no updates were left. When it runs,
|
| + // updateTexturesCompleted() will be called.
|
| + if (!updateMoreTexturesIfEnoughTimeRemaining())
|
| + m_timer->startOneShot(0);
|
| +
|
| m_firstUpdateAttempt = false;
|
| } else
|
| updateMoreTexturesNow();
|
| @@ -131,10 +133,8 @@ void CCTextureUpdateController::updateMoreTextures(double monotonicTimeLimit)
|
|
|
| void CCTextureUpdateController::onTimerFired()
|
| {
|
| - if (!m_queue->hasMoreUpdates())
|
| - return;
|
| -
|
| - updateMoreTexturesIfEnoughTimeRemaining();
|
| + if (!updateMoreTexturesIfEnoughTimeRemaining())
|
| + m_client->updateTexturesCompleted();
|
| }
|
|
|
| double CCTextureUpdateController::monotonicTimeNow() const
|
| @@ -152,11 +152,16 @@ size_t CCTextureUpdateController::updateMoreTexturesSize() const
|
| return textureUpdatesPerTick;
|
| }
|
|
|
| -void CCTextureUpdateController::updateMoreTexturesIfEnoughTimeRemaining()
|
| +bool CCTextureUpdateController::updateMoreTexturesIfEnoughTimeRemaining()
|
| {
|
| + if (!m_queue->hasMoreUpdates())
|
| + return false;
|
| +
|
| bool hasTimeRemaining = monotonicTimeNow() < m_monotonicTimeLimit - updateMoreTexturesTime();
|
| if (hasTimeRemaining)
|
| updateMoreTexturesNow();
|
| +
|
| + return true;
|
| }
|
|
|
| void CCTextureUpdateController::updateMoreTexturesNow()
|
|
|