Index: cc/ThrottledTextureUploader.cpp |
diff --git a/cc/ThrottledTextureUploader.cpp b/cc/ThrottledTextureUploader.cpp |
deleted file mode 100644 |
index 179f2b61d1922974b29b2da08bfe3c10360eb5ec..0000000000000000000000000000000000000000 |
--- a/cc/ThrottledTextureUploader.cpp |
+++ /dev/null |
@@ -1,186 +0,0 @@ |
-// Copyright 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "config.h" |
-#include "ThrottledTextureUploader.h" |
- |
-#include "Extensions3DChromium.h" |
-#include "TraceEvent.h" |
-#include <algorithm> |
-#include <public/Platform.h> |
-#include <public/WebGraphicsContext3D.h> |
-#include <vector> |
- |
-namespace { |
- |
-// How many previous uploads to use when predicting future throughput. |
-static const size_t uploadHistorySize = 100; |
- |
-// Global estimated number of textures per second to maintain estimates across |
-// subsequent instances of ThrottledTextureUploader. |
-// More than one thread will not access this variable, so we do not need to synchronize access. |
-static double estimatedTexturesPerSecondGlobal = 48.0 * 60.0; |
- |
-} // anonymous namespace |
- |
-namespace cc { |
- |
-ThrottledTextureUploader::Query::Query(WebKit::WebGraphicsContext3D* context) |
- : m_context(context) |
- , m_queryId(0) |
- , m_value(0) |
- , m_hasValue(false) |
- , m_isNonBlocking(false) |
-{ |
- m_queryId = m_context->createQueryEXT(); |
-} |
- |
-ThrottledTextureUploader::Query::~Query() |
-{ |
- m_context->deleteQueryEXT(m_queryId); |
-} |
- |
-void ThrottledTextureUploader::Query::begin() |
-{ |
- m_hasValue = false; |
- m_isNonBlocking = false; |
- m_context->beginQueryEXT(Extensions3DChromium::COMMANDS_ISSUED_CHROMIUM, m_queryId); |
-} |
- |
-void ThrottledTextureUploader::Query::end() |
-{ |
- m_context->endQueryEXT(Extensions3DChromium::COMMANDS_ISSUED_CHROMIUM); |
-} |
- |
-bool ThrottledTextureUploader::Query::isPending() |
-{ |
- unsigned available = 1; |
- m_context->getQueryObjectuivEXT(m_queryId, Extensions3DChromium::QUERY_RESULT_AVAILABLE_EXT, &available); |
- return !available; |
-} |
- |
-void ThrottledTextureUploader::Query::wait() |
-{ |
- value(); |
- return; |
-} |
- |
-unsigned ThrottledTextureUploader::Query::value() |
-{ |
- if (!m_hasValue) { |
- m_context->getQueryObjectuivEXT(m_queryId, Extensions3DChromium::QUERY_RESULT_EXT, &m_value); |
- m_hasValue = true; |
- } |
- return m_value; |
-} |
- |
-void ThrottledTextureUploader::Query::markAsNonBlocking() |
-{ |
- m_isNonBlocking = true; |
-} |
- |
-bool ThrottledTextureUploader::Query::isNonBlocking() |
-{ |
- return m_isNonBlocking; |
-} |
- |
-ThrottledTextureUploader::ThrottledTextureUploader(WebKit::WebGraphicsContext3D* context) |
- : m_context(context) |
- , m_texturesPerSecondHistory(uploadHistorySize, estimatedTexturesPerSecondGlobal) |
- , m_numBlockingTextureUploads(0) |
-{ |
-} |
- |
-ThrottledTextureUploader::~ThrottledTextureUploader() |
-{ |
-} |
- |
-size_t ThrottledTextureUploader::numBlockingUploads() |
-{ |
- processQueries(); |
- return m_numBlockingTextureUploads; |
-} |
- |
-void ThrottledTextureUploader::markPendingUploadsAsNonBlocking() |
-{ |
- for (Deque<OwnPtr<Query> >::iterator it = m_pendingQueries.begin(); |
- it != m_pendingQueries.end(); ++it) { |
- if (it->get()->isNonBlocking()) |
- continue; |
- |
- m_numBlockingTextureUploads--; |
- it->get()->markAsNonBlocking(); |
- } |
- |
- ASSERT(!m_numBlockingTextureUploads); |
-} |
- |
-double ThrottledTextureUploader::estimatedTexturesPerSecond() |
-{ |
- processQueries(); |
- |
- // The history should never be empty because we initialize all elements with an estimate. |
- ASSERT(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; |
-} |
- |
-void ThrottledTextureUploader::beginQuery() |
-{ |
- if (m_availableQueries.isEmpty()) |
- m_availableQueries.append(Query::create(m_context)); |
- |
- m_availableQueries.first()->begin(); |
-} |
- |
-void ThrottledTextureUploader::endQuery() |
-{ |
- m_availableQueries.first()->end(); |
- m_pendingQueries.append(m_availableQueries.takeFirst()); |
- m_numBlockingTextureUploads++; |
-} |
- |
-void ThrottledTextureUploader::uploadTexture(CCResourceProvider* resourceProvider, Parameters upload) |
-{ |
- bool isFullUpload = upload.destOffset.isZero() && |
- upload.sourceRect.size() == upload.texture->texture()->size(); |
- |
- if (isFullUpload) |
- beginQuery(); |
- |
- upload.texture->updateRect(resourceProvider, upload.sourceRect, upload.destOffset); |
- |
- if (isFullUpload) |
- endQuery(); |
-} |
- |
-void ThrottledTextureUploader::processQueries() |
-{ |
- while (!m_pendingQueries.isEmpty()) { |
- if (m_pendingQueries.first()->isPending()) |
- break; |
- |
- unsigned usElapsed = m_pendingQueries.first()->value(); |
- WebKit::Platform::current()->histogramCustomCounts("Renderer4.TextureGpuUploadTimeUS", usElapsed, 0, 100000, 50); |
- |
- if (!m_pendingQueries.first()->isNonBlocking()) |
- m_numBlockingTextureUploads--; |
- |
- // Remove the oldest values from our history and insert the new one |
- double texturesPerSecond = 1.0 / (usElapsed * 1e-6); |
- m_texturesPerSecondHistory.pop_back(); |
- m_texturesPerSecondHistory.push_front(texturesPerSecond); |
- |
- m_availableQueries.append(m_pendingQueries.takeFirst()); |
- } |
-} |
- |
-} |