Index: cc/CCTextureUpdateController.cpp |
diff --git a/cc/CCTextureUpdateController.cpp b/cc/CCTextureUpdateController.cpp |
index 22207de75f9adf58e4094922578427d865dc25e6..7e680124b5b69dae3858418bb15963dd0c700a1b 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; |
reveman
2012/09/18 05:30:35
We could get rid of this awkward constant if parti
brianderson
2012/09/18 20:03:00
Done.
|
+ |
+// Minimum number of textures to update with each call to updateMoreTexturesIfEnoughTimeRemaining(). |
+static const size_t textureUpdatesPerFullTickMin = 12; |
nduca
2012/09/18 03:17:06
i think this goes as low as 3 on android... though
reveman
2012/09/18 05:30:35
We should be able to just remove this now that par
brianderson
2012/09/18 20:03:00
I'd like to get rid of it too.
|
// Measured in seconds. |
static const double textureUpdateTickRate = 0.004; |
@@ -31,11 +35,20 @@ namespace cc { |
size_t CCTextureUpdateController::maxPartialTextureUpdates() |
{ |
- return textureUpdatesPerTick; |
+ return textureUpdatesPerFullTickMin; |
+} |
+ |
+size_t CCTextureUpdateController::maxFullUpdatesPerTick(TextureUploader* uploader) |
+{ |
+ double texturesPerSecond = uploader->estimatedPixelsPerSecond() / pixelsPerTexture; |
+ |
+ return std::max(textureUpdatesPerFullTickMin, |
+ (size_t) floor(textureUpdateTickRate * texturesPerSecond)); |
reveman
2012/09/18 05:30:35
Use static_cast here instead of c-style cast.
brianderson
2012/09/18 20:03:00
Done.
|
} |
void CCTextureUpdateController::updateTextures(CCResourceProvider* resourceProvider, TextureCopier* copier, TextureUploader* uploader, CCTextureUpdateQueue* queue, size_t count) |
{ |
+ TRACE_EVENT0("cc", "CCTextureUpdateController::updateTextures"); |
reveman
2012/09/18 05:30:35
You wouldn't have to touch this function at all if
brianderson
2012/09/18 20:03:00
Done.
|
if (queue->fullUploadSize() || queue->partialUploadSize()) { |
if (uploader->isBusy()) |
return; |
@@ -43,43 +56,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(); |
reveman
2012/09/18 05:30:35
nit: spelling
|
+ if (cantUpdloadAllPartials) { |
reveman
2012/09/18 05:30:35
here too
|
+ 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; |
@@ -103,6 +111,7 @@ CCTextureUpdateController::CCTextureUpdateController(CCTextureUpdateControllerCl |
, m_copier(copier) |
, m_uploader(uploader) |
, m_monotonicTimeLimit(0) |
+ , m_textureUpdatesPerTick(maxFullUpdatesPerTick(uploader)) |
, m_firstUpdateAttempt(true) |
{ |
} |
@@ -160,7 +169,7 @@ double CCTextureUpdateController::updateMoreTexturesTime() const |
size_t CCTextureUpdateController::updateMoreTexturesSize() const |
{ |
- return textureUpdatesPerTick; |
+ return m_textureUpdatesPerTick; |
} |
bool CCTextureUpdateController::updateMoreTexturesIfEnoughTimeRemaining() |
@@ -193,22 +202,16 @@ void CCTextureUpdateController::updateMoreTexturesNow() |
if (!uploads) |
return; |
+ size_t fullUploadCount = 0; |
m_uploader->beginUploads(); |
- |
- size_t uploadCount = 0; |
- while (uploads--) { |
- m_uploader->uploadTexture( |
- m_resourceProvider, m_queue->takeFirstFullUpload()); |
- uploadCount++; |
- if (!(uploadCount % textureUploadFlushPeriod)) |
+ while (m_queue->fullUploadSize() && fullUploadCount < uploads) { |
+ if (!(fullUploadCount % textureUploadFlushPeriod) && fullUploadCount) |
m_resourceProvider->shallowFlushIfSupported(); |
+ m_uploader->uploadTexture(m_resourceProvider, m_queue->takeFirstFullUpload()); |
+ fullUploadCount++; |
} |
- |
- // Make sure there are no dangling partial uploads without a flush. |
- if (uploadCount % textureUploadFlushPeriod) |
- m_resourceProvider->shallowFlushIfSupported(); |
- |
m_uploader->endUploads(); |
+ m_resourceProvider->shallowFlushIfSupported(); |
} |
} |