| Index: cc/texture_uploader.cc
|
| diff --git a/cc/texture_uploader.cc b/cc/texture_uploader.cc
|
| index 64b3de52424a4ed223a204145ef769843bfe7c79..98d15bb2fedcbe0d3a2a97c2ec157b3ea1155b71 100644
|
| --- a/cc/texture_uploader.cc
|
| +++ b/cc/texture_uploader.cc
|
| @@ -20,12 +20,13 @@
|
| namespace {
|
|
|
| // How many previous uploads to use when predicting future throughput.
|
| -static const size_t uploadHistorySize = 100;
|
| +static const size_t uploadHistorySizeMax = 1000;
|
| +static const size_t uploadHistorySizeInitial = 100;
|
|
|
| // Global estimated number of textures per second to maintain estimates across
|
| // subsequent instances of TextureUploader.
|
| // More than one thread will not access this variable, so we do not need to synchronize access.
|
| -static double estimatedTexturesPerSecondGlobal = 48.0 * 60.0;
|
| +static const double defaultEstimatedTexturesPerSecond = 48.0 * 60.0;
|
|
|
| } // anonymous namespace
|
|
|
| @@ -87,12 +88,12 @@ bool TextureUploader::Query::isNonBlocking()
|
| TextureUploader::TextureUploader(
|
| WebKit::WebGraphicsContext3D* context, bool useMapTexSubImage)
|
| : m_context(context)
|
| - , m_texturesPerSecondHistory(uploadHistorySize,
|
| - estimatedTexturesPerSecondGlobal)
|
| , m_numBlockingTextureUploads(0)
|
| , m_useMapTexSubImage(useMapTexSubImage)
|
| , m_subImageSize(0)
|
| {
|
| + for (size_t i = uploadHistorySizeInitial; i > 0; i--)
|
| + m_texturesPerSecondHistory.insert(defaultEstimatedTexturesPerSecond);
|
| }
|
|
|
| TextureUploader::~TextureUploader()
|
| @@ -123,17 +124,11 @@ double TextureUploader::estimatedTexturesPerSecond()
|
| {
|
| processQueries();
|
|
|
| - // The history should never be empty because we initialize all elements with an estimate.
|
| - DCHECK(m_texturesPerSecondHistory.size() == uploadHistorySize);
|
| -
|
| - // Sort the history and use the median as our estimate.
|
| - std::vector<double> sortedHistory(m_texturesPerSecondHistory.begin(),
|
| - m_texturesPerSecondHistory.end());
|
| - std::sort(sortedHistory.begin(), sortedHistory.end());
|
| -
|
| - estimatedTexturesPerSecondGlobal = sortedHistory[sortedHistory.size() * 2 / 3];
|
| - TRACE_COUNTER1("cc", "estimatedTexturesPerSecond", estimatedTexturesPerSecondGlobal);
|
| - return estimatedTexturesPerSecondGlobal;
|
| + // Use the median as our estimate.
|
| + std::multiset<double>::iterator median = m_texturesPerSecondHistory.begin();
|
| + std::advance(median, m_texturesPerSecondHistory.size() / 2);
|
| + TRACE_COUNTER1("cc", "estimatedTexturesPerSecond", *median);
|
| + return *median;
|
| }
|
|
|
| void TextureUploader::beginQuery()
|
| @@ -339,10 +334,13 @@ void TextureUploader::processQueries()
|
| if (!m_pendingQueries.first()->isNonBlocking())
|
| m_numBlockingTextureUploads--;
|
|
|
| - // Remove the oldest values from our history and insert the new one
|
| + // Remove the min and max value from our history and insert the new one.
|
| double texturesPerSecond = 1.0 / (usElapsed * 1e-6);
|
| - m_texturesPerSecondHistory.pop_back();
|
| - m_texturesPerSecondHistory.push_front(texturesPerSecond);
|
| + if (m_texturesPerSecondHistory.size() >= uploadHistorySizeMax) {
|
| + m_texturesPerSecondHistory.erase(m_texturesPerSecondHistory.begin());
|
| + m_texturesPerSecondHistory.erase(--m_texturesPerSecondHistory.end());
|
| + }
|
| + m_texturesPerSecondHistory.insert(texturesPerSecond);
|
|
|
| m_availableQueries.append(m_pendingQueries.takeFirst());
|
| }
|
|
|