Index: cc/CCTextureUpdateController.cpp |
diff --git a/cc/CCTextureUpdateController.cpp b/cc/CCTextureUpdateController.cpp |
index 22207de75f9adf58e4094922578427d865dc25e6..9c0fc5608fc026e74c9a41d73dbbbddb681c855a 100644 |
--- a/cc/CCTextureUpdateController.cpp |
+++ b/cc/CCTextureUpdateController.cpp |
@@ -9,12 +9,16 @@ |
#include "GraphicsContext3D.h" |
#include "TextureCopier.h" |
#include "TextureUploader.h" |
+#include "TraceEvent.h" |
+#include <limits> |
#include <wtf/CurrentTime.h> |
namespace { |
-// Number of textures to update with each call to updateMoreTexturesIfEnoughTimeRemaining(). |
-static const size_t textureUpdatesPerTick = 12; |
+static const size_t pixelsPerTexture = 256 * 256; |
+ |
+// Minimum number of textures to update with each call to updateMoreTexturesIfEnoughTimeRemaining(). |
+static const size_t textureUpdatesPerFullTickMin = 12; |
// Measured in seconds. |
static const double textureUpdateTickRate = 0.004; |
@@ -29,13 +33,27 @@ static const int textureUploadFlushPeriod = 4; |
namespace cc { |
-size_t CCTextureUpdateController::maxPartialTextureUpdates() |
+size_t CCTextureUpdateController::maxPartialUpdatesDefault() |
+{ |
+ return textureUpdatesPerFullTickMin; |
+} |
+ |
+size_t CCTextureUpdateController::maxPartialUpdates(TextureUploader* uploader) |
+{ |
+ return maxFullUpdatesPerTick(uploader); |
+} |
+ |
+size_t CCTextureUpdateController::maxFullUpdatesPerTick(TextureUploader* uploader) |
{ |
- return textureUpdatesPerTick; |
+ double texturesPerSecond = uploader->estimatedPixelsPerSecond() / pixelsPerTexture; |
+ |
+ return std::max(textureUpdatesPerFullTickMin, |
+ (size_t) floor(textureUpdateTickRate * texturesPerSecond)); |
} |
void CCTextureUpdateController::updateTextures(CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader, CCTextureUpdateQueue* queue, size_t count) |
brianderson
2012/09/18 00:45:52
The previous patch set had a few bugs that caused
|
{ |
+ TRACE_EVENT0("cc", "CCTextureUpdateController::updateTextures"); |
if (queue->fullUploadSize() || queue->partialUploadSize()) { |
if (uploader->isBusy()) |
return; |
@@ -43,43 +61,38 @@ void CCTextureUpdateController::updateTextures(CCResourceProvider* resourceProvi |
uploader->beginUploads(); |
size_t fullUploadCount = 0; |
- while (queue->fullUploadSize() && fullUploadCount < count) { |
- uploader->uploadTexture(resourceProvider, queue->takeFirstFullUpload()); |
- fullUploadCount++; |
- if (!(fullUploadCount % textureUploadFlushPeriod)) |
+ if (queue->fullUploadSize()) { |
+ while (queue->fullUploadSize() && fullUploadCount < count) { |
+ if (!(fullUploadCount % textureUploadFlushPeriod) && fullUploadCount) |
+ resourceProvider->shallowFlushIfSupported(); |
+ uploader->uploadTexture(resourceProvider, queue->takeFirstFullUpload()); |
+ fullUploadCount++; |
+ } |
+ |
+ bool cantUpdloadAllPartials = (count - fullUploadCount) < queue->partialUploadSize(); |
+ if (cantUpdloadAllPartials) { |
+ uploader->endUploads(); |
resourceProvider->shallowFlushIfSupported(); |
+ return; |
+ } |
} |
- // Make sure there are no dangling uploads without a flush. |
- if (fullUploadCount % textureUploadFlushPeriod) |
- resourceProvider->shallowFlushIfSupported(); |
- |
- bool moreUploads = queue->fullUploadSize(); |
- |
- ASSERT(queue->partialUploadSize() <= count); |
- // We need another update batch if the number of updates remaining |
- // in |count| is greater than the remaining partial entries. |
- if ((count - fullUploadCount) < queue->partialUploadSize()) |
- moreUploads = true; |
- |
- if (moreUploads) { |
- uploader->endUploads(); |
- return; |
- } |
+ ASSERT(queue->partialUploadSize() <= (count - fullUploadCount)); |
size_t partialUploadCount = 0; |
- while (queue->partialUploadSize()) { |
- uploader->uploadTexture(resourceProvider, queue->takeFirstPartialUpload()); |
- partialUploadCount++; |
- if (!(partialUploadCount % textureUploadFlushPeriod)) |
+ if (queue->partialUploadSize()) { |
+ if (fullUploadCount) |
resourceProvider->shallowFlushIfSupported(); |
+ while (queue->partialUploadSize()) { |
+ if (!(partialUploadCount % textureUploadFlushPeriod) && partialUploadCount) |
+ resourceProvider->shallowFlushIfSupported(); |
+ uploader->uploadTexture(resourceProvider, queue->takeFirstPartialUpload()); |
+ partialUploadCount++; |
+ } |
} |
- // Make sure there are no dangling partial uploads without a flush. |
- if (partialUploadCount % textureUploadFlushPeriod) |
- resourceProvider->shallowFlushIfSupported(); |
- |
uploader->endUploads(); |
+ resourceProvider->shallowFlushIfSupported(); |
} |
size_t copyCount = 0; |
@@ -95,7 +108,7 @@ void CCTextureUpdateController::updateTextures(CCResourceProvider* resourceProvi |
copier->flush(); |
} |
-CCTextureUpdateController::CCTextureUpdateController(CCTextureUpdateControllerClient* client, CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader) |
+CCTextureUpdateController::CCTextureUpdateController(CCTextureUpdateControllerClient* client, CCThread* thread, PassOwnPtr<CCTextureUpdateQueue> queue, CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader, size_t maxPartialTextureUpdates) |
: m_client(client) |
, m_timer(adoptPtr(new CCTimer(thread, this))) |
, m_queue(queue) |
@@ -103,6 +116,8 @@ CCTextureUpdateController::CCTextureUpdateController(CCTextureUpdateControllerCl |
, m_copier(copier) |
, m_uploader(uploader) |
, m_monotonicTimeLimit(0) |
+ , m_textureUpdatesPerTick(maxFullUpdatesPerTick(uploader)) |
+ , m_maxPartialTextureUpdates(maxPartialTextureUpdates) |
, m_firstUpdateAttempt(true) |
{ |
} |
@@ -160,7 +175,9 @@ double CCTextureUpdateController::updateMoreTexturesTime() const |
size_t CCTextureUpdateController::updateMoreTexturesSize() const |
{ |
- return textureUpdatesPerTick; |
+ if (m_queue->fullUploadSize() && !m_queue->partialUploadSize()) |
+ return m_maxPartialTextureUpdates; |
+ return m_textureUpdatesPerTick; |
} |
bool CCTextureUpdateController::updateMoreTexturesIfEnoughTimeRemaining() |