Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(399)

Side by Side Diff: cc/resources/direct_raster_worker_pool.cc

Issue 228173002: cc: Separate RasterWorkerPool interface from implementation details. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address review feedback Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/resources/direct_raster_worker_pool.h ('k') | cc/resources/image_raster_worker_pool.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/resources/direct_raster_worker_pool.h" 5 #include "cc/resources/direct_raster_worker_pool.h"
6 6
7 #include "base/debug/trace_event.h" 7 #include "base/debug/trace_event.h"
8 #include "cc/output/context_provider.h" 8 #include "cc/output/context_provider.h"
9 #include "cc/resources/resource.h" 9 #include "cc/resources/resource.h"
10 #include "cc/resources/resource_provider.h" 10 #include "cc/resources/resource_provider.h"
11 #include "gpu/command_buffer/client/gles2_interface.h" 11 #include "gpu/command_buffer/client/gles2_interface.h"
12 #include "third_party/skia/include/gpu/GrContext.h" 12 #include "third_party/skia/include/gpu/GrContext.h"
13 13
14 namespace cc { 14 namespace cc {
15 15
16 // static 16 // static
17 scoped_ptr<DirectRasterWorkerPool> DirectRasterWorkerPool::Create( 17 scoped_ptr<RasterWorkerPool> DirectRasterWorkerPool::Create(
18 base::SequencedTaskRunner* task_runner, 18 base::SequencedTaskRunner* task_runner,
19 ResourceProvider* resource_provider, 19 ResourceProvider* resource_provider,
20 ContextProvider* context_provider) { 20 ContextProvider* context_provider) {
21 return make_scoped_ptr(new DirectRasterWorkerPool( 21 return make_scoped_ptr<RasterWorkerPool>(new DirectRasterWorkerPool(
22 task_runner, resource_provider, context_provider)); 22 task_runner, resource_provider, context_provider));
23 } 23 }
24 24
25 DirectRasterWorkerPool::DirectRasterWorkerPool( 25 DirectRasterWorkerPool::DirectRasterWorkerPool(
26 base::SequencedTaskRunner* task_runner, 26 base::SequencedTaskRunner* task_runner,
27 ResourceProvider* resource_provider, 27 ResourceProvider* resource_provider,
28 ContextProvider* context_provider) 28 ContextProvider* context_provider)
29 : task_runner_(task_runner), 29 : task_runner_(task_runner),
30 resource_provider_(resource_provider), 30 resource_provider_(resource_provider),
31 context_provider_(context_provider), 31 context_provider_(context_provider),
32 run_tasks_on_origin_thread_pending_(false), 32 run_tasks_on_origin_thread_pending_(false),
33 raster_tasks_pending_(false), 33 raster_tasks_pending_(false),
34 raster_tasks_required_for_activation_pending_(false), 34 raster_tasks_required_for_activation_pending_(false),
35 raster_finished_weak_ptr_factory_(this), 35 raster_finished_weak_ptr_factory_(this),
36 weak_ptr_factory_(this) {} 36 weak_ptr_factory_(this) {}
37 37
38 DirectRasterWorkerPool::~DirectRasterWorkerPool() { 38 DirectRasterWorkerPool::~DirectRasterWorkerPool() {
39 DCHECK_EQ(0u, completed_tasks_.size()); 39 DCHECK_EQ(0u, completed_tasks_.size());
40 } 40 }
41 41
42 void DirectRasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { 42 Rasterizer* DirectRasterWorkerPool::AsRasterizer() { return this; }
43
44 void DirectRasterWorkerPool::SetClient(RasterizerClient* client) {
43 client_ = client; 45 client_ = client;
44 } 46 }
45 47
46 void DirectRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) { 48 void DirectRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
47 TRACE_EVENT0("cc", "DirectRasterWorkerPool::ScheduleTasks"); 49 TRACE_EVENT0("cc", "DirectRasterWorkerPool::ScheduleTasks");
48 50
49 DCHECK_EQ(queue->required_for_activation_count, 51 DCHECK_EQ(queue->required_for_activation_count,
50 static_cast<size_t>( 52 static_cast<size_t>(
51 std::count_if(queue->items.begin(), 53 std::count_if(queue->items.begin(),
52 queue->items.end(), 54 queue->items.end(),
53 RasterTaskQueue::Item::IsRequiredForActivation))); 55 RasterTaskQueue::Item::IsRequiredForActivation)));
54 56
55 raster_tasks_pending_ = true; 57 raster_tasks_pending_ = true;
56 raster_tasks_required_for_activation_pending_ = true; 58 raster_tasks_required_for_activation_pending_ = true;
57 59
58 // Cancel existing OnRasterFinished callbacks. 60 // Cancel existing OnRasterFinished callbacks.
59 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs(); 61 raster_finished_weak_ptr_factory_.InvalidateWeakPtrs();
60 62
61 scoped_refptr<internal::WorkerPoolTask> 63 scoped_refptr<internal::RasterizerTask>
62 new_raster_required_for_activation_finished_task( 64 new_raster_required_for_activation_finished_task(
63 CreateRasterRequiredForActivationFinishedTask( 65 CreateRasterRequiredForActivationFinishedTask(
64 queue->required_for_activation_count, 66 queue->required_for_activation_count,
65 task_runner_.get(), 67 task_runner_.get(),
66 base::Bind(&DirectRasterWorkerPool:: 68 base::Bind(&DirectRasterWorkerPool::
67 OnRasterRequiredForActivationFinished, 69 OnRasterRequiredForActivationFinished,
68 raster_finished_weak_ptr_factory_.GetWeakPtr()))); 70 raster_finished_weak_ptr_factory_.GetWeakPtr())));
69 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task( 71 scoped_refptr<internal::RasterizerTask> new_raster_finished_task(
70 CreateRasterFinishedTask( 72 CreateRasterFinishedTask(
71 task_runner_.get(), 73 task_runner_.get(),
72 base::Bind(&DirectRasterWorkerPool::OnRasterFinished, 74 base::Bind(&DirectRasterWorkerPool::OnRasterFinished,
73 raster_finished_weak_ptr_factory_.GetWeakPtr()))); 75 raster_finished_weak_ptr_factory_.GetWeakPtr())));
74 76
75 // Need to cancel tasks not present in new queue if we haven't had a 77 // Need to cancel tasks not present in new queue if we haven't had a
76 // chance to run the previous set of tasks yet. 78 // chance to run the previous set of tasks yet.
77 // TODO(reveman): Remove this once only tasks for which 79 // TODO(reveman): Remove this once only tasks for which
78 // ::ScheduleOnOriginThread has been called need to be canceled. 80 // ::ScheduleOnOriginThread has been called need to be canceled.
79 if (run_tasks_on_origin_thread_pending_) { 81 if (run_tasks_on_origin_thread_pending_) {
80 for (RasterTaskQueue::Item::Vector::const_iterator it = 82 for (RasterTaskQueue::Item::Vector::const_iterator it =
81 raster_tasks_.items.begin(); 83 raster_tasks_.items.begin();
82 it != raster_tasks_.items.end(); 84 it != raster_tasks_.items.end();
83 ++it) { 85 ++it) {
84 internal::RasterWorkerPoolTask* task = it->task; 86 internal::RasterTask* task = it->task;
85 87
86 if (std::find_if(queue->items.begin(), 88 if (std::find_if(queue->items.begin(),
87 queue->items.end(), 89 queue->items.end(),
88 RasterTaskQueue::Item::TaskComparator(task)) == 90 RasterTaskQueue::Item::TaskComparator(task)) ==
89 queue->items.end()) 91 queue->items.end())
90 completed_tasks_.push_back(task); 92 completed_tasks_.push_back(task);
91 } 93 }
92 } 94 }
93 95
94 ScheduleRunTasksOnOriginThread(); 96 ScheduleRunTasksOnOriginThread();
95 97
96 raster_tasks_.Swap(queue); 98 raster_tasks_.Swap(queue);
97 99
98 raster_finished_task_ = new_raster_finished_task; 100 raster_finished_task_ = new_raster_finished_task;
99 raster_required_for_activation_finished_task_ = 101 raster_required_for_activation_finished_task_ =
100 new_raster_required_for_activation_finished_task; 102 new_raster_required_for_activation_finished_task;
101 } 103 }
102 104
103 unsigned DirectRasterWorkerPool::GetResourceTarget() const { 105 unsigned DirectRasterWorkerPool::GetResourceTarget() const {
104 return GL_TEXTURE_2D; 106 return GL_TEXTURE_2D;
105 } 107 }
106 108
107 ResourceFormat DirectRasterWorkerPool::GetResourceFormat() const { 109 ResourceFormat DirectRasterWorkerPool::GetResourceFormat() const {
108 return resource_provider_->best_texture_format(); 110 return resource_provider_->best_texture_format();
109 } 111 }
110 112
111 void DirectRasterWorkerPool::CheckForCompletedTasks() { 113 void DirectRasterWorkerPool::CheckForCompletedTasks() {
112 TRACE_EVENT0("cc", "DirectRasterWorkerPool::CheckForCompletedTasks"); 114 TRACE_EVENT0("cc", "DirectRasterWorkerPool::CheckForCompletedTasks");
113 115
114 for (internal::WorkerPoolTask::Vector::const_iterator it = 116 for (internal::RasterizerTask::Vector::const_iterator it =
115 completed_tasks_.begin(); 117 completed_tasks_.begin();
116 it != completed_tasks_.end(); 118 it != completed_tasks_.end();
117 ++it) { 119 ++it) {
118 internal::WorkerPoolTask* task = it->get(); 120 internal::RasterizerTask* task = it->get();
119 121
120 task->RunReplyOnOriginThread(); 122 task->RunReplyOnOriginThread();
121 } 123 }
122 completed_tasks_.clear(); 124 completed_tasks_.clear();
123 } 125 }
124 126
125 SkCanvas* DirectRasterWorkerPool::AcquireCanvasForRaster( 127 SkCanvas* DirectRasterWorkerPool::AcquireCanvasForRaster(
126 internal::WorkerPoolTask* task, 128 internal::RasterTask* task) {
127 const Resource* resource) { 129 return resource_provider_->MapDirectRasterBuffer(task->resource()->id());
128 return resource_provider_->MapDirectRasterBuffer(resource->id());
129 } 130 }
130 131
131 void DirectRasterWorkerPool::ReleaseCanvasForRaster( 132 void DirectRasterWorkerPool::ReleaseCanvasForRaster(
132 internal::WorkerPoolTask* task, 133 internal::RasterTask* task) {
133 const Resource* resource) { 134 resource_provider_->UnmapDirectRasterBuffer(task->resource()->id());
134 resource_provider_->UnmapDirectRasterBuffer(resource->id());
135 } 135 }
136 136
137 void DirectRasterWorkerPool::OnRasterFinished() { 137 void DirectRasterWorkerPool::OnRasterFinished() {
138 TRACE_EVENT0("cc", "DirectRasterWorkerPool::OnRasterFinished"); 138 TRACE_EVENT0("cc", "DirectRasterWorkerPool::OnRasterFinished");
139 139
140 DCHECK(raster_tasks_pending_); 140 DCHECK(raster_tasks_pending_);
141 raster_tasks_pending_ = false; 141 raster_tasks_pending_ = false;
142 client_->DidFinishRunningTasks(); 142 client_->DidFinishRunningTasks();
143 } 143 }
144 144
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 179
180 GrContext* gr_context = context_provider_->GrContext(); 180 GrContext* gr_context = context_provider_->GrContext();
181 // TODO(alokp): Implement TestContextProvider::GrContext(). 181 // TODO(alokp): Implement TestContextProvider::GrContext().
182 if (gr_context) 182 if (gr_context)
183 gr_context->resetContext(); 183 gr_context->resetContext();
184 184
185 for (RasterTaskQueue::Item::Vector::const_iterator it = 185 for (RasterTaskQueue::Item::Vector::const_iterator it =
186 raster_tasks_.items.begin(); 186 raster_tasks_.items.begin();
187 it != raster_tasks_.items.end(); 187 it != raster_tasks_.items.end();
188 ++it) { 188 ++it) {
189 internal::RasterWorkerPoolTask* task = it->task; 189 internal::RasterTask* task = it->task;
190 DCHECK(!task->HasCompleted()); 190 DCHECK(!task->HasCompleted());
191 191
192 // First need to run all dependencies. 192 // First need to run all dependencies.
193 for (internal::WorkerPoolTask::Vector::const_iterator it = 193 for (internal::ImageDecodeTask::Vector::const_iterator it =
194 task->dependencies().begin(); 194 task->dependencies().begin();
195 it != task->dependencies().end(); 195 it != task->dependencies().end();
196 ++it) { 196 ++it) {
197 internal::WorkerPoolTask* dependency = it->get(); 197 internal::ImageDecodeTask* dependency = it->get();
198 if (dependency->HasCompleted()) 198 if (dependency->HasCompleted())
199 continue; 199 continue;
200 200
201 RunTaskOnOriginThread(dependency); 201 RunTaskOnOriginThread(dependency);
202 completed_tasks_.push_back(dependency); 202 completed_tasks_.push_back(dependency);
203 } 203 }
204 204
205 RunTaskOnOriginThread(task); 205 RunTaskOnOriginThread(task);
206 completed_tasks_.push_back(task); 206 completed_tasks_.push_back(task);
207 } 207 }
208 208
209 // TODO(alokp): Implement TestContextProvider::GrContext(). 209 // TODO(alokp): Implement TestContextProvider::GrContext().
210 if (gr_context) 210 if (gr_context)
211 gr_context->flush(); 211 gr_context->flush();
212 212
213 context_provider_->ContextGL()->PopGroupMarkerEXT(); 213 context_provider_->ContextGL()->PopGroupMarkerEXT();
214 } 214 }
215 215
216 RunTaskOnOriginThread(raster_required_for_activation_finished_task_.get()); 216 RunTaskOnOriginThread(raster_required_for_activation_finished_task_.get());
217 RunTaskOnOriginThread(raster_finished_task_.get()); 217 RunTaskOnOriginThread(raster_finished_task_.get());
218 } 218 }
219 219
220 void DirectRasterWorkerPool::RunTaskOnOriginThread( 220 void DirectRasterWorkerPool::RunTaskOnOriginThread(
221 internal::WorkerPoolTask* task) { 221 internal::RasterizerTask* task) {
222 task->WillSchedule(); 222 task->WillSchedule();
223 task->ScheduleOnOriginThread(this); 223 task->ScheduleOnOriginThread(this);
224 task->DidSchedule(); 224 task->DidSchedule();
225 225
226 task->WillRun(); 226 task->WillRun();
227 task->RunOnOriginThread(); 227 task->RunOnOriginThread();
228 task->DidRun(); 228 task->DidRun();
229 229
230 task->WillComplete(); 230 task->WillComplete();
231 task->CompleteOnOriginThread(this); 231 task->CompleteOnOriginThread(this);
232 task->DidComplete(); 232 task->DidComplete();
233 } 233 }
234 234
235 } // namespace cc 235 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/direct_raster_worker_pool.h ('k') | cc/resources/image_raster_worker_pool.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698