Index: cc/resource_update_controller.cc |
diff --git a/cc/resource_update_controller.cc b/cc/resource_update_controller.cc |
deleted file mode 100644 |
index 27e8e1d3e3176927020295ce227268227466c2d7..0000000000000000000000000000000000000000 |
--- a/cc/resource_update_controller.cc |
+++ /dev/null |
@@ -1,275 +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 "cc/resource_update_controller.h" |
- |
-#include <limits> |
- |
-#include "base/debug/trace_event.h" |
-#include "cc/base/thread.h" |
-#include "cc/output/context_provider.h" |
-#include "cc/output/texture_copier.h" |
-#include "cc/prioritized_resource.h" |
-#include "cc/resource_provider.h" |
-#include "skia/ext/refptr.h" |
-#include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3D.h" |
-#include "third_party/khronos/GLES2/gl2.h" |
-#include "third_party/skia/include/gpu/SkGpuDevice.h" |
- |
-using WebKit::WebGraphicsContext3D; |
- |
-namespace { |
- |
-// Number of partial updates we allow. |
-const size_t kPartialTextureUpdatesMax = 12; |
- |
-// Measured in seconds. |
-const double kTextureUpdateTickRate = 0.004; |
- |
-// Measured in seconds. |
-const double kUploaderBusyTickRate = 0.001; |
- |
-// Number of blocking update intervals to allow. |
-const size_t kMaxBlockingUpdateIntervals = 4; |
- |
-skia::RefPtr<SkCanvas> CreateAcceleratedCanvas( |
- GrContext* gr_context, gfx::Size canvasSize, unsigned textureId) { |
- GrBackendTextureDesc texture_desc; |
- texture_desc.fFlags = kRenderTarget_GrBackendTextureFlag; |
- texture_desc.fWidth = canvasSize.width(); |
- texture_desc.fHeight = canvasSize.height(); |
- texture_desc.fConfig = kSkia8888_GrPixelConfig; |
- texture_desc.fTextureHandle = textureId; |
- skia::RefPtr<GrTexture> target = |
- skia::AdoptRef(gr_context->wrapBackendTexture(texture_desc)); |
- skia::RefPtr<SkDevice> device = |
- skia::AdoptRef(new SkGpuDevice(gr_context, target.get())); |
- return skia::AdoptRef(new SkCanvas(device.get())); |
-} |
- |
-} // namespace |
- |
-namespace cc { |
- |
-size_t ResourceUpdateController::MaxPartialTextureUpdates() { |
- return kPartialTextureUpdatesMax; |
-} |
- |
-size_t ResourceUpdateController::MaxFullUpdatesPerTick( |
- ResourceProvider* resource_provider) { |
- double textures_per_second = resource_provider->EstimatedUploadsPerSecond(); |
- size_t textures_per_tick = |
- floor(kTextureUpdateTickRate * textures_per_second); |
- return textures_per_tick ? textures_per_tick : 1; |
-} |
- |
-ResourceUpdateController::ResourceUpdateController( |
- ResourceUpdateControllerClient* client, |
- Thread* thread, |
- scoped_ptr<ResourceUpdateQueue> queue, |
- ResourceProvider* resource_provider) |
- : client_(client), |
- queue_(queue.Pass()), |
- resource_provider_(resource_provider), |
- texture_updates_per_tick_(MaxFullUpdatesPerTick(resource_provider)), |
- first_update_attempt_(true), |
- thread_(thread), |
- weak_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
- task_posted_(false) {} |
- |
-ResourceUpdateController::~ResourceUpdateController() {} |
- |
-void ResourceUpdateController::PerformMoreUpdates( |
- base::TimeTicks timeLimit) { |
- time_limit_ = timeLimit; |
- |
- // Update already in progress. |
- if (task_posted_) |
- 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 (!first_update_attempt_) |
- UpdateMoreTexturesNow(); |
- |
- // Post a 0-delay task when no updates were left. When it runs, |
- // ReadyToFinalizeTextureUpdates() will be called. |
- if (!UpdateMoreTexturesIfEnoughTimeRemaining()) { |
- task_posted_ = true; |
- thread_->PostTask( |
- base::Bind(&ResourceUpdateController::OnTimerFired, |
- weak_factory_.GetWeakPtr())); |
- } |
- |
- first_update_attempt_ = false; |
-} |
- |
-void ResourceUpdateController::DiscardUploadsToEvictedResources() { |
- queue_->clearUploadsToEvictedResources(); |
-} |
- |
-void ResourceUpdateController::UpdateTexture(ResourceUpdate update) { |
- if (update.picture) { |
- PrioritizedResource* texture = update.texture; |
- gfx::Rect picture_rect = update.content_rect; |
- gfx::Rect source_rect = update.source_rect; |
- gfx::Vector2d dest_offset = update.dest_offset; |
- |
- texture->acquireBackingTexture(resource_provider_); |
- DCHECK(texture->haveBackingTexture()); |
- |
- DCHECK(resource_provider_->GetResourceType(texture->resourceId()) == |
- ResourceProvider::GLTexture); |
- |
- cc::ContextProvider* offscreen_contexts = |
- resource_provider_->offscreen_context_provider(); |
- |
- ResourceProvider::ScopedWriteLockGL lock( |
- resource_provider_, texture->resourceId()); |
- |
- // Flush the compositor context to ensure that textures there are available |
- // in the shared context. Do this after locking/creating the compositor |
- // texture. |
- resource_provider_->Flush(); |
- |
- // Make sure skia uses the correct GL context. |
- offscreen_contexts->Context3d()->makeContextCurrent(); |
- |
- // Create an accelerated canvas to draw on. |
- skia::RefPtr<SkCanvas> canvas = CreateAcceleratedCanvas( |
- offscreen_contexts->GrContext(), texture->size(), lock.texture_id()); |
- |
- // 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(dest_offset.x(), |
- dest_offset.y(), |
- source_rect.width(), |
- source_rect.height())); |
- // Translate the origin of picture_rect to dest_offset. |
- // Note that dest_offset is defined relative to source_rect. |
- canvas->translate( |
- picture_rect.x() - source_rect.x() + dest_offset.x(), |
- picture_rect.y() - source_rect.y() + dest_offset.y()); |
- canvas->drawPicture(*update.picture); |
- |
- // Flush skia context so that all the rendered stuff appears on the |
- // texture. |
- offscreen_contexts->GrContext()->flush(); |
- |
- // Flush the GL context so rendering results from this context are |
- // visible in the compositor's context. |
- offscreen_contexts->Context3d()->flush(); |
- |
- // Use the compositor's GL context again. |
- resource_provider_->GraphicsContext3D()->makeContextCurrent(); |
- } |
- |
- if (update.bitmap) { |
- update.bitmap->lockPixels(); |
- update.texture->setPixels( |
- resource_provider_, |
- static_cast<const uint8_t*>(update.bitmap->getPixels()), |
- update.content_rect, |
- update.source_rect, |
- update.dest_offset); |
- update.bitmap->unlockPixels(); |
- } |
-} |
- |
-void ResourceUpdateController::Finalize() { |
- while (queue_->fullUploadSize()) |
- UpdateTexture(queue_->takeFirstFullUpload()); |
- |
- while (queue_->partialUploadSize()) |
- UpdateTexture(queue_->takeFirstPartialUpload()); |
- |
- resource_provider_->FlushUploads(); |
- |
- if (queue_->copySize()) { |
- TextureCopier* copier = resource_provider_->texture_copier(); |
- while (queue_->copySize()) |
- copier->CopyTexture(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 ResourceUpdateController::OnTimerFired() { |
- task_posted_ = false; |
- if (!UpdateMoreTexturesIfEnoughTimeRemaining()) |
- client_->ReadyToFinalizeTextureUpdates(); |
-} |
- |
-base::TimeTicks ResourceUpdateController::Now() const { |
- return base::TimeTicks::Now(); |
-} |
- |
-base::TimeDelta ResourceUpdateController::UpdateMoreTexturesTime() const { |
- return base::TimeDelta::FromMilliseconds(kTextureUpdateTickRate * 1000); |
-} |
- |
-size_t ResourceUpdateController::UpdateMoreTexturesSize() const { |
- return texture_updates_per_tick_; |
-} |
- |
-size_t ResourceUpdateController::MaxBlockingUpdates() const { |
- return UpdateMoreTexturesSize() * kMaxBlockingUpdateIntervals; |
-} |
- |
-base::TimeDelta ResourceUpdateController::PendingUpdateTime() const { |
- base::TimeDelta update_one_resource_time = |
- UpdateMoreTexturesTime() / UpdateMoreTexturesSize(); |
- return update_one_resource_time * resource_provider_->NumBlockingUploads(); |
-} |
- |
-bool ResourceUpdateController::UpdateMoreTexturesIfEnoughTimeRemaining() { |
- while (resource_provider_->NumBlockingUploads() < MaxBlockingUpdates()) { |
- if (!queue_->fullUploadSize()) |
- return false; |
- |
- if (!time_limit_.is_null()) { |
- // Estimated completion time of all pending updates. |
- base::TimeTicks completion_time = Now() + PendingUpdateTime(); |
- |
- // Time remaining based on current completion estimate. |
- base::TimeDelta time_remaining = time_limit_ - completion_time; |
- |
- if (time_remaining < UpdateMoreTexturesTime()) |
- return true; |
- } |
- |
- UpdateMoreTexturesNow(); |
- } |
- |
- task_posted_ = true; |
- thread_->PostDelayedTask( |
- base::Bind(&ResourceUpdateController::OnTimerFired, |
- weak_factory_.GetWeakPtr()), |
- base::TimeDelta::FromMilliseconds(kUploaderBusyTickRate * 1000)); |
- return true; |
-} |
- |
-void ResourceUpdateController::UpdateMoreTexturesNow() { |
- size_t uploads = std::min( |
- queue_->fullUploadSize(), UpdateMoreTexturesSize()); |
- |
- if (!uploads) |
- return; |
- |
- while (queue_->fullUploadSize() && uploads--) |
- UpdateTexture(queue_->takeFirstFullUpload()); |
- |
- resource_provider_->FlushUploads(); |
-} |
- |
-} // namespace cc |