// 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. #ifndef CC_RESOURCES_RESOURCE_UPDATE_CONTROLLER_H_ #define CC_RESOURCES_RESOURCE_UPDATE_CONTROLLER_H_ #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" #include "cc/base/cc_export.h" #include "cc/resources/resource_update_queue.h" namespace base { class SingleThreadTaskRunner; } namespace cc { class ResourceProvider; class ResourceUpdateControllerClient { public: virtual void ReadyToFinalizeTextureUpdates() = 0; protected: virtual ~ResourceUpdateControllerClient() {} }; class CC_EXPORT ResourceUpdateController { public: static scoped_ptr Create( ResourceUpdateControllerClient* client, base::SingleThreadTaskRunner* task_runner, scoped_ptr queue, ResourceProvider* resource_provider) { return make_scoped_ptr(new ResourceUpdateController( client, task_runner, queue.Pass(), resource_provider)); } static size_t MaxPartialTextureUpdates(); virtual ~ResourceUpdateController(); // Discard uploads to textures that were evicted on the impl thread. void DiscardUploadsToEvictedResources(); void PerformMoreUpdates(base::TimeTicks time_limit); void Finalize(); // Virtual for testing. virtual base::TimeTicks Now() const; virtual base::TimeDelta UpdateMoreTexturesTime() const; virtual size_t UpdateMoreTexturesSize() const; protected: ResourceUpdateController(ResourceUpdateControllerClient* client, base::SingleThreadTaskRunner* task_runner, scoped_ptr queue, ResourceProvider* resource_provider); private: static size_t MaxFullUpdatesPerTick(ResourceProvider* resource_provider); size_t MaxBlockingUpdates() const; base::TimeDelta PendingUpdateTime() const; void UpdateTexture(ResourceUpdate update); // This returns true when there were textures left to update. bool UpdateMoreTexturesIfEnoughTimeRemaining(); void UpdateMoreTexturesNow(); void OnTimerFired(); ResourceUpdateControllerClient* client_; scoped_ptr queue_; bool contents_textures_purged_; ResourceProvider* resource_provider_; base::TimeTicks time_limit_; size_t texture_updates_per_tick_; bool first_update_attempt_; base::SingleThreadTaskRunner* task_runner_; base::WeakPtrFactory weak_factory_; bool task_posted_; DISALLOW_COPY_AND_ASSIGN(ResourceUpdateController); }; } // namespace cc #endif // CC_RESOURCES_RESOURCE_UPDATE_CONTROLLER_H_