Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1054)

Unified Diff: cc/texture_update_controller.cc

Issue 11270047: cc: Rename TextureUpdate to ResourceUpdate. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sort includes and forward declarations. Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/texture_update_controller.h ('k') | cc/texture_update_controller_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/texture_update_controller.cc
diff --git a/cc/texture_update_controller.cc b/cc/texture_update_controller.cc
deleted file mode 100644
index a289935f62ef2f096c8a9094b52a24e2fe7a51ab..0000000000000000000000000000000000000000
--- a/cc/texture_update_controller.cc
+++ /dev/null
@@ -1,294 +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 "cc/texture_update_controller.h"
-
-#include "base/debug/trace_event.h"
-#include "cc/prioritized_texture.h"
-#include "cc/proxy.h"
-#include "cc/resource_provider.h"
-#include "cc/texture_copier.h"
-#include "third_party/khronos/GLES2/gl2.h"
-#include "third_party/skia/include/gpu/SkGpuDevice.h"
-#include <limits>
-#include <public/WebGraphicsContext3D.h>
-#include <public/WebSharedGraphicsContext3D.h>
-#include <wtf/CurrentTime.h>
-
-using WebKit::WebGraphicsContext3D;
-using WebKit::WebSharedGraphicsContext3D;
-
-namespace {
-
-// Number of partial updates we allow.
-const size_t partialTextureUpdatesMax = 12;
-
-// Measured in seconds.
-const double textureUpdateTickRate = 0.004;
-
-// Measured in seconds.
-const double uploaderBusyTickRate = 0.001;
-
-// Flush interval when performing texture uploads.
-const int textureUploadFlushPeriod = 4;
-
-// Number of blocking update intervals to allow.
-const size_t maxBlockingUpdateIntervals = 4;
-
-scoped_ptr<SkCanvas> createAcceleratedCanvas(
- GrContext* grContext, cc::IntSize canvasSize, unsigned textureId)
-{
- GrPlatformTextureDesc textureDesc;
- textureDesc.fFlags = kRenderTarget_GrPlatformTextureFlag;
- textureDesc.fWidth = canvasSize.width();
- textureDesc.fHeight = canvasSize.height();
- textureDesc.fConfig = kSkia8888_GrPixelConfig;
- textureDesc.fTextureHandle = textureId;
- SkAutoTUnref<GrTexture> target(
- grContext->createPlatformTexture(textureDesc));
- SkAutoTUnref<SkDevice> device(new SkGpuDevice(grContext, target.get()));
- return make_scoped_ptr(new SkCanvas(device.get()));
-}
-
-} // namespace
-
-namespace cc {
-
-size_t TextureUpdateController::maxPartialTextureUpdates()
-{
- return partialTextureUpdatesMax;
-}
-
-size_t TextureUpdateController::maxFullUpdatesPerTick(
- ResourceProvider* resourceProvider)
-{
- double texturesPerSecond = resourceProvider->estimatedUploadsPerSecond();
- size_t texturesPerTick = floor(textureUpdateTickRate * texturesPerSecond);
- return texturesPerTick ? texturesPerTick : 1;
-}
-
-TextureUpdateController::TextureUpdateController(TextureUpdateControllerClient* client, Thread* thread, scoped_ptr<TextureUpdateQueue> queue, ResourceProvider* resourceProvider)
- : m_client(client)
- , m_timer(new Timer(thread, this))
- , m_queue(queue.Pass())
- , m_resourceProvider(resourceProvider)
- , m_textureUpdatesPerTick(maxFullUpdatesPerTick(resourceProvider))
- , m_firstUpdateAttempt(true)
-{
-}
-
-TextureUpdateController::~TextureUpdateController()
-{
-}
-
-void TextureUpdateController::performMoreUpdates(
- base::TimeTicks timeLimit)
-{
- m_timeLimit = timeLimit;
-
- // Update already in progress.
- if (m_timer->isActive())
- return;
-
- // Call updateMoreTexturesNow() directly unless it's the first update
- // attempt. This ensures that we empty the update queue in a finite
- // amount of time.
- if (m_firstUpdateAttempt) {
- // Post a 0-delay task when no updates were left. When it runs,
- // readyToFinalizeTextureUpdates() will be called.
- if (!updateMoreTexturesIfEnoughTimeRemaining())
- m_timer->startOneShot(0);
-
- m_firstUpdateAttempt = false;
- } else
- updateMoreTexturesNow();
-}
-
-void TextureUpdateController::discardUploadsToEvictedResources()
-{
- m_queue->clearUploadsToEvictedResources();
-}
-
-void TextureUpdateController::updateTexture(ResourceUpdate update)
-{
- if (update.picture) {
- PrioritizedTexture* texture = update.texture;
- IntRect pictureRect = update.content_rect;
- IntRect sourceRect = update.source_rect;
- IntSize destOffset = update.dest_offset;
-
- texture->acquireBackingTexture(m_resourceProvider);
- DCHECK(texture->haveBackingTexture());
-
- DCHECK(m_resourceProvider->resourceType(texture->resourceId()) ==
- ResourceProvider::GLTexture);
-
- WebGraphicsContext3D* paintContext = Proxy::hasImplThread() ?
- WebSharedGraphicsContext3D::compositorThreadContext() :
- WebSharedGraphicsContext3D::mainThreadContext();
- GrContext* paintGrContext = Proxy::hasImplThread() ?
- WebSharedGraphicsContext3D::compositorThreadGrContext() :
- WebSharedGraphicsContext3D::mainThreadGrContext();
-
- // Flush the context in which the backing texture is created so that it
- // is available in other shared contexts. It is important to do here
- // because the backing texture is created in one context while it is
- // being written to in another.
- m_resourceProvider->flush();
- ResourceProvider::ScopedWriteLockGL lock(
- m_resourceProvider, texture->resourceId());
-
- // Make sure ganesh uses the correct GL context.
- paintContext->makeContextCurrent();
-
- // Create an accelerated canvas to draw on.
- scoped_ptr<SkCanvas> canvas = createAcceleratedCanvas(
- paintGrContext, texture->size(), lock.textureId());
-
- // The compositor expects the textures to be upside-down so it can flip
- // the final composited image. Ganesh renders the image upright so we
- // need to do a y-flip.
- canvas->translate(0.0, texture->size().height());
- canvas->scale(1.0, -1.0);
- // Clip to the destination on the texture that must be updated.
- canvas->clipRect(SkRect::MakeXYWH(destOffset.width(),
- destOffset.height(),
- sourceRect.width(),
- sourceRect.height()));
- // Translate the origin of pictureRect to destOffset.
- // Note that destOffset is defined relative to sourceRect.
- canvas->translate(
- pictureRect.x() - sourceRect.x() + destOffset.width(),
- pictureRect.y() - sourceRect.y() + destOffset.height());
- canvas->drawPicture(*update.picture);
-
- // Flush ganesh context so that all the rendered stuff appears on the
- // texture.
- paintGrContext->flush();
-
- // Flush the GL context so rendering results from this context are
- // visible in the compositor's context.
- paintContext->flush();
- }
-
- if (update.bitmap) {
- update.bitmap->lockPixels();
- update.texture->upload(
- m_resourceProvider,
- static_cast<const uint8_t*>(update.bitmap->getPixels()),
- update.content_rect,
- update.source_rect,
- update.dest_offset);
- update.bitmap->unlockPixels();
- }
-}
-
-void TextureUpdateController::finalize()
-{
- size_t uploadCount = 0;
- while (m_queue->fullUploadSize()) {
- if (!(uploadCount % textureUploadFlushPeriod) && uploadCount)
- m_resourceProvider->shallowFlushIfSupported();
-
- updateTexture(m_queue->takeFirstFullUpload());
- uploadCount++;
- }
-
- while (m_queue->partialUploadSize()) {
- if (!(uploadCount % textureUploadFlushPeriod) && uploadCount)
- m_resourceProvider->shallowFlushIfSupported();
-
- updateTexture(m_queue->takeFirstPartialUpload());
- uploadCount++;
- }
-
- if (uploadCount)
- m_resourceProvider->shallowFlushIfSupported();
-
- if (m_queue->copySize()) {
- TextureCopier* copier = m_resourceProvider->textureCopier();
- while (m_queue->copySize())
- copier->copyTexture(m_queue->takeFirstCopy());
-
- // If we've performed any texture copies, we need to insert a flush
- // here into the compositor context before letting the main thread
- // proceed as it may make draw calls to the source texture of one of
- // our copy operations.
- copier->flush();
- }
-}
-
-void TextureUpdateController::onTimerFired()
-{
- ResourceProvider::debugNotifyEnterZone(0xB000000);
- if (!updateMoreTexturesIfEnoughTimeRemaining())
- m_client->readyToFinalizeTextureUpdates();
- ResourceProvider::debugNotifyLeaveZone();
-}
-
-base::TimeTicks TextureUpdateController::now() const
-{
- return base::TimeTicks::Now();
-}
-
-base::TimeDelta TextureUpdateController::updateMoreTexturesTime() const
-{
- return base::TimeDelta::FromMilliseconds(textureUpdateTickRate * 1000);
-}
-
-size_t TextureUpdateController::updateMoreTexturesSize() const
-{
- return m_textureUpdatesPerTick;
-}
-
-size_t TextureUpdateController::maxBlockingUpdates() const
-{
- return updateMoreTexturesSize() * maxBlockingUpdateIntervals;
-}
-
-bool TextureUpdateController::updateMoreTexturesIfEnoughTimeRemaining()
-{
- // Blocking uploads will increase when we're too aggressive in our upload
- // time estimate. We use a different timeout here to prevent unnecessary
- // amounts of idle time when blocking uploads have reached the max.
- if (m_resourceProvider->numBlockingUploads() >= maxBlockingUpdates()) {
- m_timer->startOneShot(uploaderBusyTickRate);
- return true;
- }
-
- if (!m_queue->fullUploadSize())
- return false;
-
- bool hasTimeRemaining = m_timeLimit.is_null() ||
- this->now() < m_timeLimit - updateMoreTexturesTime();
- if (hasTimeRemaining)
- updateMoreTexturesNow();
-
- return true;
-}
-
-void TextureUpdateController::updateMoreTexturesNow()
-{
- size_t uploads = std::min(
- m_queue->fullUploadSize(), updateMoreTexturesSize());
- m_timer->startOneShot(
- updateMoreTexturesTime().InSecondsF() / updateMoreTexturesSize() *
- uploads);
-
- if (!uploads)
- return;
-
- size_t uploadCount = 0;
- while (m_queue->fullUploadSize() && uploadCount < uploads) {
- if (!(uploadCount % textureUploadFlushPeriod) && uploadCount)
- m_resourceProvider->shallowFlushIfSupported();
- updateTexture(m_queue->takeFirstFullUpload());
- uploadCount++;
- }
- m_resourceProvider->shallowFlushIfSupported();
-}
-
-} // namespace cc
« no previous file with comments | « cc/texture_update_controller.h ('k') | cc/texture_update_controller_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698