diff options
Diffstat (limited to 'cc/CCTextureUpdateController.cpp')
-rw-r--r-- | cc/CCTextureUpdateController.cpp | 40 |
1 files changed, 26 insertions, 14 deletions
diff --git a/cc/CCTextureUpdateController.cpp b/cc/CCTextureUpdateController.cpp index 25d41cc..9c448be 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,34 +108,40 @@ 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(); } -void CCTextureUpdateController::onTimerFired() +void CCTextureUpdateController::discardUploads() { - if (!m_queue->hasMoreUpdates()) - return; + // CCTextureUpdateControllerClient::updateTexturesCompleted will be + // called when all remaining texture copies are done. + m_queue->clearUploads(); +} - updateMoreTexturesIfEnoughTimeRemaining(); +void CCTextureUpdateController::onTimerFired() +{ + if (!updateMoreTexturesIfEnoughTimeRemaining()) + m_client->updateTexturesCompleted(); } double CCTextureUpdateController::monotonicTimeNow() const @@ -152,11 +159,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() |