Chromium Code Reviews| Index: cc/CCTextureUpdateController.cpp |
| diff --git a/cc/CCTextureUpdateController.cpp b/cc/CCTextureUpdateController.cpp |
| index 73e22c79c00b2c426daa6c7ae9225820c82d5088..22fbd46fe63168aaedb92d29497130692e79e0ee 100644 |
| --- a/cc/CCTextureUpdateController.cpp |
| +++ b/cc/CCTextureUpdateController.cpp |
| @@ -19,6 +19,9 @@ static const size_t textureUpdatesPerTick = 12; |
| // Measured in seconds. |
| static const double textureUpdateTickRate = 0.004; |
| +// Measured in seconds. |
| +static const double uploaderBusyTickRate = 0.001; |
| + |
| // Flush interval when performing texture uploads. |
| static const int textureUploadFlushPeriod = 4; |
| @@ -131,6 +134,13 @@ void CCTextureUpdateController::updateMoreTextures(double monotonicTimeLimit) |
| updateMoreTexturesNow(); |
| } |
| +void CCTextureUpdateController::updateAllTexturesNow() |
| +{ |
| + while (m_queue->hasMoreUpdates()) |
| + updateTextures(m_resourceProvider, m_copier, m_uploader, m_queue.get(), |
| + updateMoreTexturesSize()); |
| +} |
| + |
| void CCTextureUpdateController::onTimerFired() |
| { |
| if (!updateMoreTexturesIfEnoughTimeRemaining()) |
| @@ -154,7 +164,15 @@ size_t CCTextureUpdateController::updateMoreTexturesSize() const |
| bool CCTextureUpdateController::updateMoreTexturesIfEnoughTimeRemaining() |
| { |
| - if (!m_queue->hasMoreUpdates()) |
| + // Uploader might be busy when we're too aggressive in our upload time |
| + // estimate. We use a different timeout here to prevent unnecessary |
| + // amounts idle time. |
| + if (m_uploader->isBusy()) { |
| + m_timer->startOneShot(uploaderBusyTickRate); |
| + return true; |
| + } |
| + |
| + if (!m_queue->fullUploadSize()) |
| return false; |
| bool hasTimeRemaining = monotonicTimeNow() < m_monotonicTimeLimit - updateMoreTexturesTime(); |
| @@ -166,8 +184,30 @@ bool CCTextureUpdateController::updateMoreTexturesIfEnoughTimeRemaining() |
| void CCTextureUpdateController::updateMoreTexturesNow() |
|
nduca
2012/09/17 18:26:15
I think you could make this whole patch a lot clea
|
| { |
| - m_timer->startOneShot(updateMoreTexturesTime()); |
| - updateTextures(m_resourceProvider, m_copier, m_uploader, m_queue.get(), updateMoreTexturesSize()); |
| + size_t uploads = std::min( |
| + m_queue->fullUploadSize(), updateMoreTexturesSize()); |
| + m_timer->startOneShot( |
| + updateMoreTexturesTime() / updateMoreTexturesSize() * uploads); |
| + |
| + if (!uploads) |
| + return; |
| + |
| + m_uploader->beginUploads(); |
| + |
| + size_t uploadCount = 0; |
| + while (uploads--) { |
| + m_uploader->uploadTexture( |
| + m_resourceProvider, m_queue->takeFirstFullUpload()); |
| + uploadCount++; |
| + if (!(uploadCount % textureUploadFlushPeriod)) |
| + m_resourceProvider->shallowFlushIfSupported(); |
| + } |
| + |
| + // Make sure there are no dangling partial uploads without a flush. |
| + if (uploadCount % textureUploadFlushPeriod) |
| + m_resourceProvider->shallowFlushIfSupported(); |
| + |
| + m_uploader->endUploads(); |
| } |
| } |