Index: cc/resources/one_copy_raster_worker_pool.h |
diff --git a/cc/resources/one_copy_raster_worker_pool.h b/cc/resources/one_copy_raster_worker_pool.h |
index c84b5595e731a3bd4ed8f6f06f94df520e9fb7fc..7372fb7ae47f5b3b63cb7d8e8d4cbf9a559c7e8a 100644 |
--- a/cc/resources/one_copy_raster_worker_pool.h |
+++ b/cc/resources/one_copy_raster_worker_pool.h |
@@ -6,10 +6,13 @@ |
#define CC_RESOURCES_ONE_COPY_RASTER_WORKER_POOL_H_ |
#include "base/memory/weak_ptr.h" |
+#include "base/synchronization/lock.h" |
#include "base/values.h" |
+#include "cc/base/scoped_ptr_deque.h" |
#include "cc/output/context_provider.h" |
#include "cc/resources/raster_worker_pool.h" |
#include "cc/resources/rasterizer.h" |
+#include "cc/resources/resource_provider.h" |
namespace base { |
namespace debug { |
@@ -21,7 +24,8 @@ class TracedValue; |
namespace cc { |
class ResourcePool; |
class ResourceProvider; |
-class ScopedResource; |
+ |
+typedef int64 CopySequenceNumber; |
class CC_EXPORT OneCopyRasterWorkerPool : public RasterWorkerPool, |
public Rasterizer, |
@@ -50,6 +54,17 @@ class CC_EXPORT OneCopyRasterWorkerPool : public RasterWorkerPool, |
const Resource* resource) override; |
void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) override; |
+ // Schedule copy of |src| resource to |dst| resource. Returns a non-zero |
+ // sequence number for this copy operation. |
+ CopySequenceNumber ScheduleCopyOnWorkerThread( |
+ scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> write_lock, |
+ const Resource* src, |
+ const Resource* dst); |
+ |
+ // Issues copy operations until |sequence| has been processed. This will |
+ // return immediately if |sequence| has already been processed. |
+ void AdvanceLastIssuedCopyTo(CopySequenceNumber sequence); |
+ |
protected: |
OneCopyRasterWorkerPool(base::SequencedTaskRunner* task_runner, |
TaskGraphRunner* task_graph_runner, |
@@ -58,7 +73,23 @@ class CC_EXPORT OneCopyRasterWorkerPool : public RasterWorkerPool, |
ResourcePool* resource_pool); |
private: |
+ struct CopyOperation { |
+ typedef ScopedPtrDeque<CopyOperation> Deque; |
+ |
+ CopyOperation( |
+ scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> write_lock, |
+ ResourceProvider::ResourceId src, |
+ ResourceProvider::ResourceId dst); |
+ ~CopyOperation(); |
+ |
+ scoped_ptr<ResourceProvider::ScopedWriteLockGpuMemoryBuffer> write_lock; |
+ ResourceProvider::ResourceId src; |
+ ResourceProvider::ResourceId dst; |
+ }; |
+ |
void OnRasterFinished(TaskSet task_set); |
+ void AdvanceLastFlushedCopyTo(CopySequenceNumber sequence); |
+ void IssueCopyOperations(int64 count); |
scoped_refptr<base::debug::ConvertableToTraceFormat> StateAsValue() const; |
void StagingStateAsValueInto(base::debug::TracedValue* staging_state) const; |
@@ -71,12 +102,22 @@ class CC_EXPORT OneCopyRasterWorkerPool : public RasterWorkerPool, |
ResourcePool* resource_pool_; |
TaskSetCollection raster_pending_; |
scoped_refptr<RasterizerTask> raster_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_; |
+ base::Lock lock_; |
+ // |lock_| must be acquired when accessing the following members. |
+ CopyOperation::Deque pending_copy_operations_; |
+ CopySequenceNumber next_copy_operation_sequence_; |
+ |
+ base::WeakPtrFactory<OneCopyRasterWorkerPool> weak_ptr_factory_; |
+ // "raster finished" tasks need their own factory as they need to be |
+ // canceled when ScheduleTasks() is called. |
base::WeakPtrFactory<OneCopyRasterWorkerPool> |
raster_finished_weak_ptr_factory_; |