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

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

Issue 165603002: cc: Move GPU raster to DirectRasterWorkerPool. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 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/pixel_buffer_raster_worker_pool.h" 5 #include "cc/resources/pixel_buffer_raster_worker_pool.h"
6 6
7 #include "base/containers/stack_container.h" 7 #include "base/containers/stack_container.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "base/values.h" 9 #include "base/values.h"
10 #include "cc/debug/traced_value.h" 10 #include "cc/debug/traced_value.h"
(...skipping 12 matching lines...) Expand all
23 // Only used as std::find_if predicate for DCHECKs. 23 // Only used as std::find_if predicate for DCHECKs.
24 bool WasCanceled(const internal::RasterWorkerPoolTask* task) { 24 bool WasCanceled(const internal::RasterWorkerPoolTask* task) {
25 return !task->HasFinishedRunning(); 25 return !task->HasFinishedRunning();
26 } 26 }
27 27
28 } // namespace 28 } // namespace
29 29
30 // static 30 // static
31 scoped_ptr<RasterWorkerPool> PixelBufferRasterWorkerPool::Create( 31 scoped_ptr<RasterWorkerPool> PixelBufferRasterWorkerPool::Create(
32 ResourceProvider* resource_provider, 32 ResourceProvider* resource_provider,
33 ContextProvider* context_provider,
34 size_t max_transfer_buffer_usage_bytes) { 33 size_t max_transfer_buffer_usage_bytes) {
35 return make_scoped_ptr<RasterWorkerPool>( 34 return make_scoped_ptr<RasterWorkerPool>(
36 new PixelBufferRasterWorkerPool(GetTaskGraphRunner(), 35 new PixelBufferRasterWorkerPool(GetTaskGraphRunner(),
37 resource_provider, 36 resource_provider,
38 context_provider,
39 max_transfer_buffer_usage_bytes)); 37 max_transfer_buffer_usage_bytes));
40 } 38 }
41 39
42 PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool( 40 PixelBufferRasterWorkerPool::PixelBufferRasterWorkerPool(
43 internal::TaskGraphRunner* task_graph_runner, 41 internal::TaskGraphRunner* task_graph_runner,
44 ResourceProvider* resource_provider, 42 ResourceProvider* resource_provider,
45 ContextProvider* context_provider,
46 size_t max_transfer_buffer_usage_bytes) 43 size_t max_transfer_buffer_usage_bytes)
47 : RasterWorkerPool(task_graph_runner, resource_provider, context_provider), 44 : RasterWorkerPool(task_graph_runner, resource_provider),
48 shutdown_(false), 45 shutdown_(false),
49 scheduled_raster_task_count_(0), 46 scheduled_raster_task_count_(0),
50 bytes_pending_upload_(0), 47 bytes_pending_upload_(0),
51 max_bytes_pending_upload_(max_transfer_buffer_usage_bytes), 48 max_bytes_pending_upload_(max_transfer_buffer_usage_bytes),
52 has_performed_uploads_since_last_flush_(false), 49 has_performed_uploads_since_last_flush_(false),
53 check_for_completed_raster_tasks_pending_(false), 50 check_for_completed_raster_tasks_pending_(false),
54 should_notify_client_if_no_tasks_are_pending_(false), 51 should_notify_client_if_no_tasks_are_pending_(false),
55 should_notify_client_if_no_tasks_required_for_activation_are_pending_( 52 should_notify_client_if_no_tasks_required_for_activation_are_pending_(
56 false), 53 false),
57 raster_finished_task_pending_(false), 54 raster_finished_task_pending_(false),
(...skipping 26 matching lines...) Expand all
84 81
85 // All unscheduled tasks need to be canceled. 82 // All unscheduled tasks need to be canceled.
86 if (it->second == UNSCHEDULED) { 83 if (it->second == UNSCHEDULED) {
87 completed_raster_tasks_.push_back(task); 84 completed_raster_tasks_.push_back(task);
88 it->second = COMPLETED; 85 it->second = COMPLETED;
89 } 86 }
90 } 87 }
91 DCHECK_EQ(completed_raster_tasks_.size(), raster_task_states_.size()); 88 DCHECK_EQ(completed_raster_tasks_.size(), raster_task_states_.size());
92 } 89 }
93 90
94 void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { 91 void PixelBufferRasterWorkerPool::ScheduleTasks(RasterTaskQueue* queue) {
95 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks"); 92 TRACE_EVENT0("cc", "PixelBufferRasterWorkerPool::ScheduleTasks");
96 93
94 DCHECK_EQ(queue->required_for_activation_count,
95 static_cast<size_t>(
96 std::count_if(queue->tasks.begin(),
97 queue->tasks.end(),
98 RasterTaskQueue::Task::IsRequiredForActivation)));
99
97 if (!should_notify_client_if_no_tasks_are_pending_) 100 if (!should_notify_client_if_no_tasks_are_pending_)
98 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this); 101 TRACE_EVENT_ASYNC_BEGIN0("cc", "ScheduledTasks", this);
99 102
100 should_notify_client_if_no_tasks_are_pending_ = true; 103 should_notify_client_if_no_tasks_are_pending_ = true;
101 should_notify_client_if_no_tasks_required_for_activation_are_pending_ = true; 104 should_notify_client_if_no_tasks_required_for_activation_are_pending_ = true;
102 105
103 raster_tasks_required_for_activation_.clear(); 106 raster_tasks_required_for_activation_.clear();
104 107
105 // Build new raster task state map. 108 // Build new raster task state map.
106 RasterTaskStateMap new_raster_task_states; 109 RasterTaskStateMap new_raster_task_states;
107 RasterTaskVector gpu_raster_tasks;
108 for (RasterTaskQueueIterator it(queue); it; ++it) { 110 for (RasterTaskQueueIterator it(queue); it; ++it) {
109 internal::RasterWorkerPoolTask* task = *it; 111 internal::RasterWorkerPoolTask* task = *it;
110 DCHECK(new_raster_task_states.find(task) == new_raster_task_states.end()); 112 DCHECK(new_raster_task_states.find(task) == new_raster_task_states.end());
111 113
112 if (task->use_gpu_rasterization()) {
113 gpu_raster_tasks.push_back(task);
114 continue;
115 }
116
117 RasterTaskStateMap::iterator state_it = raster_task_states_.find(task); 114 RasterTaskStateMap::iterator state_it = raster_task_states_.find(task);
118 if (state_it != raster_task_states_.end()) { 115 if (state_it != raster_task_states_.end()) {
119 RasterTaskState state = state_it->second; 116 RasterTaskState state = state_it->second;
120 117
121 new_raster_task_states[task] = state; 118 new_raster_task_states[task] = state;
122 // |raster_tasks_required_for_activation_| contains all tasks that need to 119 // |raster_tasks_required_for_activation_| contains all tasks that need to
123 // complete before we can send a "ready to activate" signal. Tasks that 120 // complete before we can send a "ready to activate" signal. Tasks that
124 // have already completed should not be part of this set. 121 // have already completed should not be part of this set.
125 if (state != COMPLETED && it.required_for_activation()) 122 if (state != COMPLETED && it.required_for_activation())
126 raster_tasks_required_for_activation_.insert(task); 123 raster_tasks_required_for_activation_.insert(task);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 FlushUploads(); 165 FlushUploads();
169 166
170 // Schedule new tasks. 167 // Schedule new tasks.
171 ScheduleMoreTasks(); 168 ScheduleMoreTasks();
172 169
173 // Cancel any pending check for completed raster tasks and schedule 170 // Cancel any pending check for completed raster tasks and schedule
174 // another check. 171 // another check.
175 check_for_completed_raster_tasks_time_ = base::TimeTicks(); 172 check_for_completed_raster_tasks_time_ = base::TimeTicks();
176 ScheduleCheckForCompletedRasterTasks(); 173 ScheduleCheckForCompletedRasterTasks();
177 174
178 if (!gpu_raster_tasks.empty())
179 RunGpuRasterTasks(gpu_raster_tasks);
180
181 TRACE_EVENT_ASYNC_STEP_INTO1( 175 TRACE_EVENT_ASYNC_STEP_INTO1(
182 "cc", 176 "cc",
183 "ScheduledTasks", 177 "ScheduledTasks",
184 this, 178 this,
185 StateName(), 179 StateName(),
186 "state", 180 "state",
187 TracedValue::FromValue(StateAsValue().release())); 181 TracedValue::FromValue(StateAsValue().release()));
188 } 182 }
189 183
190 unsigned PixelBufferRasterWorkerPool::GetResourceTarget() const { 184 unsigned PixelBufferRasterWorkerPool::GetResourceTarget() const {
(...skipping 25 matching lines...) Expand all
216 completed_raster_tasks_.front().get(); 210 completed_raster_tasks_.front().get();
217 DCHECK(raster_task_states_.find(task) != raster_task_states_.end()); 211 DCHECK(raster_task_states_.find(task) != raster_task_states_.end());
218 DCHECK_EQ(COMPLETED, raster_task_states_[task]); 212 DCHECK_EQ(COMPLETED, raster_task_states_[task]);
219 213
220 raster_task_states_.erase(task); 214 raster_task_states_.erase(task);
221 215
222 task->RunReplyOnOriginThread(); 216 task->RunReplyOnOriginThread();
223 217
224 completed_raster_tasks_.pop_front(); 218 completed_raster_tasks_.pop_front();
225 } 219 }
226
227 CheckForCompletedGpuRasterTasks();
228 } 220 }
229 221
230 SkCanvas* PixelBufferRasterWorkerPool::AcquireCanvasForRaster( 222 SkCanvas* PixelBufferRasterWorkerPool::AcquireCanvasForRaster(
231 internal::RasterWorkerPoolTask* task) { 223 internal::RasterWorkerPoolTask* task) {
232 if (task->use_gpu_rasterization())
233 return resource_provider()->MapDirectRasterBuffer(task->resource()->id());
234
235 resource_provider()->AcquirePixelRasterBuffer(task->resource()->id()); 224 resource_provider()->AcquirePixelRasterBuffer(task->resource()->id());
236 return resource_provider()->MapPixelRasterBuffer(task->resource()->id()); 225 return resource_provider()->MapPixelRasterBuffer(task->resource()->id());
237 } 226 }
238 227
239 void PixelBufferRasterWorkerPool::OnRasterCompleted( 228 void PixelBufferRasterWorkerPool::OnRasterCompleted(
240 internal::RasterWorkerPoolTask* task, 229 internal::RasterWorkerPoolTask* task,
241 const PicturePileImpl::Analysis& analysis) { 230 const PicturePileImpl::Analysis& analysis) {
242 if (task->use_gpu_rasterization()) {
243 resource_provider()->UnmapDirectRasterBuffer(task->resource()->id());
244 return;
245 }
246
247 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("cc"), 231 TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("cc"),
248 "PixelBufferRasterWorkerPool::OnRasterCompleted", 232 "PixelBufferRasterWorkerPool::OnRasterCompleted",
249 "was_canceled", 233 "was_canceled",
250 !task->HasFinishedRunning(), 234 !task->HasFinishedRunning(),
251 "needs_upload", 235 "needs_upload",
252 task->HasFinishedRunning() && !analysis.is_solid_color); 236 task->HasFinishedRunning() && !analysis.is_solid_color);
253 237
254 DCHECK(raster_task_states_.find(task) != raster_task_states_.end()); 238 DCHECK(raster_task_states_.find(task) != raster_task_states_.end());
255 DCHECK_EQ(SCHEDULED, raster_task_states_[task]); 239 DCHECK_EQ(SCHEDULED, raster_task_states_[task]);
256 240
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after
700 684
701 throttle_state->SetInteger("bytes_available_for_upload", 685 throttle_state->SetInteger("bytes_available_for_upload",
702 max_bytes_pending_upload_ - bytes_pending_upload_); 686 max_bytes_pending_upload_ - bytes_pending_upload_);
703 throttle_state->SetInteger("bytes_pending_upload", bytes_pending_upload_); 687 throttle_state->SetInteger("bytes_pending_upload", bytes_pending_upload_);
704 throttle_state->SetInteger("scheduled_raster_task_count", 688 throttle_state->SetInteger("scheduled_raster_task_count",
705 scheduled_raster_task_count_); 689 scheduled_raster_task_count_);
706 return throttle_state.PassAs<base::Value>(); 690 return throttle_state.PassAs<base::Value>();
707 } 691 }
708 692
709 } // namespace cc 693 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698