| Index: cc/raster/one_copy_tile_task_worker_pool.h
 | 
| diff --git a/cc/raster/one_copy_tile_task_worker_pool.h b/cc/raster/one_copy_tile_task_worker_pool.h
 | 
| index 6554fccb256945ee2573f495407b856a8b20a449..4e050b4c2023a6bba1ca0d706e404bd6fba5706b 100644
 | 
| --- a/cc/raster/one_copy_tile_task_worker_pool.h
 | 
| +++ b/cc/raster/one_copy_tile_task_worker_pool.h
 | 
| @@ -5,12 +5,8 @@
 | 
|  #ifndef CC_RASTER_ONE_COPY_TILE_TASK_WORKER_POOL_H_
 | 
|  #define CC_RASTER_ONE_COPY_TILE_TASK_WORKER_POOL_H_
 | 
|  
 | 
| -#include <set>
 | 
| -
 | 
|  #include "base/memory/weak_ptr.h"
 | 
|  #include "base/synchronization/lock.h"
 | 
| -#include "base/time/time.h"
 | 
| -#include "base/trace_event/memory_dump_provider.h"
 | 
|  #include "base/values.h"
 | 
|  #include "cc/base/scoped_ptr_deque.h"
 | 
|  #include "cc/output/context_provider.h"
 | 
| @@ -25,20 +21,15 @@
 | 
|  }
 | 
|  }
 | 
|  
 | 
| -namespace gpu {
 | 
| -namespace gles2 {
 | 
| -class GLES2Interface;
 | 
| -}
 | 
| -}
 | 
| -
 | 
|  namespace cc {
 | 
|  class ResourcePool;
 | 
| +class ScopedResource;
 | 
|  
 | 
| -class CC_EXPORT OneCopyTileTaskWorkerPool
 | 
| -    : public TileTaskWorkerPool,
 | 
| -      public TileTaskRunner,
 | 
| -      public TileTaskClient,
 | 
| -      public base::trace_event::MemoryDumpProvider {
 | 
| +typedef int64 CopySequenceNumber;
 | 
| +
 | 
| +class CC_EXPORT OneCopyTileTaskWorkerPool : public TileTaskWorkerPool,
 | 
| +                                            public TileTaskRunner,
 | 
| +                                            public TileTaskClient {
 | 
|   public:
 | 
|    ~OneCopyTileTaskWorkerPool() override;
 | 
|  
 | 
| @@ -47,10 +38,9 @@
 | 
|        TaskGraphRunner* task_graph_runner,
 | 
|        ContextProvider* context_provider,
 | 
|        ResourceProvider* resource_provider,
 | 
| +      ResourcePool* resource_pool,
 | 
|        int max_copy_texture_chromium_size,
 | 
| -      bool use_persistent_gpu_memory_buffers,
 | 
| -      unsigned image_target,
 | 
| -      int max_staging_buffers);
 | 
| +      bool have_persistent_gpu_memory_buffers);
 | 
|  
 | 
|    // Overridden from TileTaskWorkerPool:
 | 
|    TileTaskRunner* AsTileTaskRunner() override;
 | 
| @@ -70,58 +60,61 @@
 | 
|        uint64_t previous_content_id) override;
 | 
|    void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) override;
 | 
|  
 | 
| -  // Overridden from base::trace_event::MemoryDumpProvider:
 | 
| -  bool OnMemoryDump(const base::trace_event::MemoryDumpArgs& args,
 | 
| -                    base::trace_event::ProcessMemoryDump* pmd) override;
 | 
| -
 | 
| -  // Playback raster source and copy result into |resource|.
 | 
| -  void PlaybackAndCopyOnWorkerThread(
 | 
| -      const Resource* resource,
 | 
| -      const ResourceProvider::ScopedWriteLockGL* resource_lock,
 | 
| +  // Playback raster source and schedule copy of |raster_resource| resource to
 | 
| +  // |output_resource|. Returns a non-zero sequence number for this copy
 | 
| +  // operation.
 | 
| +  CopySequenceNumber PlaybackAndScheduleCopyOnWorkerThread(
 | 
| +      bool reusing_raster_resource,
 | 
| +      scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer>
 | 
| +          raster_resource_write_lock,
 | 
| +      const Resource* raster_resource,
 | 
| +      const Resource* output_resource,
 | 
|        const RasterSource* raster_source,
 | 
|        const gfx::Rect& raster_full_rect,
 | 
|        const gfx::Rect& raster_dirty_rect,
 | 
|        float scale,
 | 
| -      bool include_images,
 | 
| -      uint64_t resource_content_id,
 | 
| -      uint64_t previous_content_id);
 | 
| +      bool include_images);
 | 
| +
 | 
| +  // Issues copy operations until |sequence| has been processed. This will
 | 
| +  // return immediately if |sequence| has already been processed.
 | 
| +  void AdvanceLastIssuedCopyTo(CopySequenceNumber sequence);
 | 
| +
 | 
| +  bool have_persistent_gpu_memory_buffers() const {
 | 
| +    return have_persistent_gpu_memory_buffers_;
 | 
| +  }
 | 
|  
 | 
|   protected:
 | 
|    OneCopyTileTaskWorkerPool(base::SequencedTaskRunner* task_runner,
 | 
|                              TaskGraphRunner* task_graph_runner,
 | 
| +                            ContextProvider* context_provider,
 | 
|                              ResourceProvider* resource_provider,
 | 
| +                            ResourcePool* resource_pool,
 | 
|                              int max_copy_texture_chromium_size,
 | 
| -                            bool use_persistent_gpu_memory_buffers,
 | 
| -                            unsigned image_target,
 | 
| -                            int max_staging_buffers);
 | 
| +                            bool have_persistent_gpu_memory_buffers);
 | 
|  
 | 
|   private:
 | 
| -  struct StagingBuffer {
 | 
| -    explicit StagingBuffer(const gfx::Size& size);
 | 
| -    ~StagingBuffer();
 | 
| +  struct CopyOperation {
 | 
| +    typedef ScopedPtrDeque<CopyOperation> Deque;
 | 
|  
 | 
| -    void DestroyGLResources(gpu::gles2::GLES2Interface* gl);
 | 
| -    void OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd,
 | 
| -                      ResourceFormat format,
 | 
| -                      bool is_free) const;
 | 
| +    CopyOperation(scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer>
 | 
| +                      src_write_lock,
 | 
| +                  const Resource* src,
 | 
| +                  const Resource* dst,
 | 
| +                  const gfx::Rect& rect);
 | 
| +    ~CopyOperation();
 | 
|  
 | 
| -    const gfx::Size size;
 | 
| -    scoped_ptr<gfx::GpuMemoryBuffer> gpu_memory_buffer;
 | 
| -    base::TimeTicks last_usage;
 | 
| -    unsigned texture_id;
 | 
| -    unsigned image_id;
 | 
| -    unsigned query_id;
 | 
| -    uint64_t content_id;
 | 
| +    scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> src_write_lock;
 | 
| +    const Resource* src;
 | 
| +    const Resource* dst;
 | 
| +    const gfx::Rect rect;
 | 
|    };
 | 
|  
 | 
| -  scoped_ptr<StagingBuffer> AcquireStagingBuffer(const Resource* resource,
 | 
| -                                                 uint64_t previous_content_id);
 | 
| -  base::TimeTicks GetUsageTimeForLRUBuffer();
 | 
| -  void ScheduleReduceMemoryUsage();
 | 
| -  void ReduceMemoryUsage();
 | 
| -  void ReleaseBuffersNotUsedSince(base::TimeTicks time);
 | 
| -
 | 
|    void OnTaskSetFinished(TaskSet task_set);
 | 
| +  void AdvanceLastFlushedCopyTo(CopySequenceNumber sequence);
 | 
| +  void IssueCopyOperations(int64 count);
 | 
| +  void ScheduleCheckForCompletedCopyOperationsWithLockAcquired(
 | 
| +      bool wait_if_needed);
 | 
| +  void CheckForCompletedCopyOperations(bool wait_if_needed);
 | 
|    scoped_refptr<base::trace_event::ConvertableToTraceFormat> StateAsValue()
 | 
|        const;
 | 
|    void StagingStateAsValueInto(
 | 
| @@ -131,30 +124,31 @@
 | 
|    TaskGraphRunner* task_graph_runner_;
 | 
|    const NamespaceToken namespace_token_;
 | 
|    TileTaskRunnerClient* client_;
 | 
| -  ResourceProvider* const resource_provider_;
 | 
| +  ContextProvider* context_provider_;
 | 
| +  ResourceProvider* resource_provider_;
 | 
| +  ResourcePool* resource_pool_;
 | 
|    const int max_bytes_per_copy_operation_;
 | 
| -  const bool use_persistent_gpu_memory_buffers_;
 | 
| -  const unsigned image_target_;
 | 
| +  const bool have_persistent_gpu_memory_buffers_;
 | 
|    TaskSetCollection tasks_pending_;
 | 
|    scoped_refptr<TileTask> task_set_finished_tasks_[kNumberOfTaskSets];
 | 
| +  CopySequenceNumber last_issued_copy_operation_;
 | 
| +  CopySequenceNumber last_flushed_copy_operation_;
 | 
|  
 | 
|    // Task graph used when scheduling tasks and vector used to gather
 | 
|    // completed tasks.
 | 
|    TaskGraph graph_;
 | 
|    Task::Vector completed_tasks_;
 | 
|  
 | 
| -  mutable base::Lock lock_;
 | 
| +  base::Lock lock_;
 | 
|    // |lock_| must be acquired when accessing the following members.
 | 
| -  using StagingBufferSet = std::set<StagingBuffer*>;
 | 
| -  StagingBufferSet buffers_;
 | 
| -  using StagingBufferDeque = ScopedPtrDeque<StagingBuffer>;
 | 
| -  StagingBufferDeque free_buffers_;
 | 
| -  StagingBufferDeque busy_buffers_;
 | 
| +  base::ConditionVariable copy_operation_count_cv_;
 | 
|    int bytes_scheduled_since_last_flush_;
 | 
| -  size_t max_staging_buffers_;
 | 
| -  const base::TimeDelta staging_buffer_expiration_delay_;
 | 
| -  bool reduce_memory_usage_pending_;
 | 
| -  base::Closure reduce_memory_usage_callback_;
 | 
| +  size_t issued_copy_operation_count_;
 | 
| +  CopyOperation::Deque pending_copy_operations_;
 | 
| +  CopySequenceNumber next_copy_operation_sequence_;
 | 
| +  bool check_for_completed_copy_operations_pending_;
 | 
| +  base::TimeTicks last_check_for_completed_copy_operations_time_;
 | 
| +  bool shutdown_;
 | 
|  
 | 
|    base::WeakPtrFactory<OneCopyTileTaskWorkerPool> weak_ptr_factory_;
 | 
|    // "raster finished" tasks need their own factory as they need to be
 | 
| 
 |