1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef CC_RESOURCES_PIXEL_BUFFER_RASTER_WORKER_POOL_H_ 6#define CC_RESOURCES_PIXEL_BUFFER_RASTER_WORKER_POOL_H_ 7 8#include <deque> 9#include <vector> 10 11#include "base/memory/weak_ptr.h" 12#include "base/values.h" 13#include "cc/base/delayed_unique_notifier.h" 14#include "cc/output/context_provider.h" 15#include "cc/resources/raster_worker_pool.h" 16#include "cc/resources/rasterizer.h" 17 18namespace base { 19namespace debug { 20class ConvertableToTraceFormat; 21class TracedValue; 22} 23} 24 25namespace cc { 26class ResourceProvider; 27 28class CC_EXPORT PixelBufferRasterWorkerPool : public RasterWorkerPool, 29 public Rasterizer, 30 public RasterizerTaskClient { 31 public: 32 virtual ~PixelBufferRasterWorkerPool(); 33 34 static scoped_ptr<RasterWorkerPool> Create( 35 base::SequencedTaskRunner* task_runner, 36 TaskGraphRunner* task_graph_runner, 37 ContextProvider* context_provider, 38 ResourceProvider* resource_provider, 39 size_t max_transfer_buffer_usage_bytes); 40 41 // Overridden from RasterWorkerPool: 42 virtual Rasterizer* AsRasterizer() OVERRIDE; 43 44 // Overridden from Rasterizer: 45 virtual void SetClient(RasterizerClient* client) OVERRIDE; 46 virtual void Shutdown() OVERRIDE; 47 virtual void ScheduleTasks(RasterTaskQueue* queue) OVERRIDE; 48 virtual void CheckForCompletedTasks() OVERRIDE; 49 50 // Overridden from RasterizerTaskClient: 51 virtual scoped_ptr<RasterBuffer> AcquireBufferForRaster( 52 const Resource* resource) OVERRIDE; 53 virtual void ReleaseBufferForRaster(scoped_ptr<RasterBuffer> buffer) OVERRIDE; 54 55 private: 56 struct RasterTaskState { 57 class TaskComparator { 58 public: 59 explicit TaskComparator(const RasterTask* task) : task_(task) {} 60 61 bool operator()(const RasterTaskState& state) const { 62 return state.task == task_; 63 } 64 65 private: 66 const RasterTask* task_; 67 }; 68 69 typedef std::vector<RasterTaskState> Vector; 70 71 RasterTaskState(RasterTask* task, const TaskSetCollection& task_sets); 72 73 enum { UNSCHEDULED, SCHEDULED, UPLOADING, COMPLETED } type; 74 RasterTask* task; 75 TaskSetCollection task_sets; 76 }; 77 78 typedef std::deque<scoped_refptr<RasterTask> > RasterTaskDeque; 79 80 PixelBufferRasterWorkerPool(base::SequencedTaskRunner* task_runner, 81 TaskGraphRunner* task_graph_runner, 82 ContextProvider* context_provider, 83 ResourceProvider* resource_provider, 84 size_t max_transfer_buffer_usage_bytes); 85 86 void OnRasterFinished(TaskSet task_set); 87 void FlushUploads(); 88 void CheckForCompletedUploads(); 89 void CheckForCompletedRasterTasks(); 90 void ScheduleMoreTasks(); 91 unsigned PendingRasterTaskCount() const; 92 TaskSetCollection PendingTasks() const; 93 void CheckForCompletedRasterizerTasks(); 94 95 const char* StateName() const; 96 scoped_refptr<base::debug::ConvertableToTraceFormat> StateAsValue() const; 97 void ThrottleStateAsValueInto(base::debug::TracedValue* throttle_state) const; 98 99 scoped_refptr<base::SequencedTaskRunner> task_runner_; 100 TaskGraphRunner* task_graph_runner_; 101 const NamespaceToken namespace_token_; 102 RasterizerClient* client_; 103 ContextProvider* context_provider_; 104 ResourceProvider* resource_provider_; 105 106 bool shutdown_; 107 108 RasterTaskQueue raster_tasks_; 109 RasterTaskState::Vector raster_task_states_; 110 RasterTaskDeque raster_tasks_with_pending_upload_; 111 RasterTask::Vector completed_raster_tasks_; 112 RasterizerTask::Vector completed_image_decode_tasks_; 113 114 size_t scheduled_raster_task_count_; 115 size_t task_counts_[kNumberOfTaskSets]; 116 size_t bytes_pending_upload_; 117 size_t max_bytes_pending_upload_; 118 bool has_performed_uploads_since_last_flush_; 119 120 TaskSetCollection should_notify_client_if_no_tasks_are_pending_; 121 TaskSetCollection raster_finished_tasks_pending_; 122 123 DelayedUniqueNotifier check_for_completed_raster_task_notifier_; 124 125 scoped_refptr<RasterizerTask> raster_finished_tasks_[kNumberOfTaskSets]; 126 127 // Task graph used when scheduling tasks and vector used to gather 128 // completed tasks. 129 TaskGraph graph_; 130 Task::Vector completed_tasks_; 131 132 base::WeakPtrFactory<PixelBufferRasterWorkerPool> 133 raster_finished_weak_ptr_factory_; 134 135 DISALLOW_COPY_AND_ASSIGN(PixelBufferRasterWorkerPool); 136}; 137 138} // namespace cc 139 140#endif // CC_RESOURCES_PIXEL_BUFFER_RASTER_WORKER_POOL_H_ 141