Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/image_raster_worker_pool.h" | 5 #include "cc/resources/image_raster_worker_pool.h" |
| 6 | 6 |
| 7 #include "base/debug/trace_event.h" | 7 #include "base/debug/trace_event.h" |
| 8 #include "base/values.h" | 8 #include "base/values.h" |
| 9 #include "cc/debug/traced_value.h" | 9 #include "cc/debug/traced_value.h" |
| 10 #include "cc/resources/resource.h" | 10 #include "cc/resources/resource.h" |
| 11 #include "third_party/skia/include/core/SkBitmapDevice.h" | 11 #include "third_party/skia/include/core/SkBitmapDevice.h" |
| 12 | 12 |
| 13 namespace cc { | 13 namespace cc { |
| 14 | 14 |
| 15 namespace { | 15 namespace { |
| 16 | 16 |
| 17 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask { | 17 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask { |
|
reveman
2013/12/17 23:03:16
FYI, you can exercise this RasterWorkerPool impl o
alokp
2013/12/17 23:26:08
does it work on windows?
reveman
2013/12/18 00:09:51
It should. If it doesn't, please file a bug. It sh
| |
| 18 public: | 18 public: |
| 19 typedef base::Callback<void(bool was_canceled)> Reply; | 19 typedef base::Callback<void(bool was_canceled)> Reply; |
| 20 | 20 |
| 21 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task, | 21 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task, |
| 22 uint8_t* buffer, | 22 uint8_t* buffer, |
| 23 int stride, | 23 int stride, |
| 24 const Reply& reply) | 24 const Reply& reply) |
| 25 : task_(task), | 25 : task_(task), |
| 26 buffer_(buffer), | 26 buffer_(buffer), |
| 27 stride_(stride), | 27 stride_(stride), |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 51 int stride_; | 51 int stride_; |
| 52 const Reply reply_; | 52 const Reply reply_; |
| 53 | 53 |
| 54 DISALLOW_COPY_AND_ASSIGN(ImageWorkerPoolTaskImpl); | 54 DISALLOW_COPY_AND_ASSIGN(ImageWorkerPoolTaskImpl); |
| 55 }; | 55 }; |
| 56 | 56 |
| 57 } // namespace | 57 } // namespace |
| 58 | 58 |
| 59 ImageRasterWorkerPool::ImageRasterWorkerPool( | 59 ImageRasterWorkerPool::ImageRasterWorkerPool( |
| 60 ResourceProvider* resource_provider, | 60 ResourceProvider* resource_provider, |
| 61 ContextProvider* context_provider, | |
| 61 size_t num_threads, | 62 size_t num_threads, |
| 62 GLenum texture_target) | 63 GLenum texture_target) |
| 63 : RasterWorkerPool(resource_provider, num_threads), | 64 : RasterWorkerPool(resource_provider, context_provider, num_threads), |
| 64 texture_target_(texture_target), | 65 texture_target_(texture_target), |
| 65 raster_tasks_pending_(false), | 66 raster_tasks_pending_(false), |
| 66 raster_tasks_required_for_activation_pending_(false) { | 67 raster_tasks_required_for_activation_pending_(false) { |
| 67 } | 68 } |
| 68 | 69 |
| 69 ImageRasterWorkerPool::~ImageRasterWorkerPool() { | 70 ImageRasterWorkerPool::~ImageRasterWorkerPool() { |
| 70 DCHECK_EQ(0u, image_tasks_.size()); | 71 DCHECK_EQ(0u, image_tasks_.size()); |
| 71 } | 72 } |
| 72 | 73 |
| 73 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { | 74 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) { |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 93 priority++, | 94 priority++, |
| 94 &graph); | 95 &graph); |
| 95 | 96 |
| 96 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task( | 97 scoped_refptr<internal::WorkerPoolTask> new_raster_finished_task( |
| 97 CreateRasterFinishedTask()); | 98 CreateRasterFinishedTask()); |
| 98 internal::GraphNode* raster_finished_node = | 99 internal::GraphNode* raster_finished_node = |
| 99 CreateGraphNodeForTask(new_raster_finished_task.get(), | 100 CreateGraphNodeForTask(new_raster_finished_task.get(), |
| 100 priority++, | 101 priority++, |
| 101 &graph); | 102 &graph); |
| 102 | 103 |
| 104 RasterTaskVector gpu_rasterization_tasks; | |
| 105 | |
| 103 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); | 106 for (RasterTaskVector::const_iterator it = raster_tasks().begin(); |
| 104 it != raster_tasks().end(); ++it) { | 107 it != raster_tasks().end(); ++it) { |
| 105 internal::RasterWorkerPoolTask* task = it->get(); | 108 internal::RasterWorkerPoolTask* task = it->get(); |
| 106 DCHECK(!task->HasCompleted()); | 109 DCHECK(!task->HasCompleted()); |
| 107 DCHECK(!task->WasCanceled()); | 110 DCHECK(!task->WasCanceled()); |
| 108 | 111 |
| 112 if (task->use_gpu_rasterization()) { | |
| 113 gpu_rasterization_tasks.push_back(task); | |
| 114 continue; | |
| 115 } | |
| 116 | |
| 109 TaskMap::iterator image_it = image_tasks_.find(task); | 117 TaskMap::iterator image_it = image_tasks_.find(task); |
| 110 if (image_it != image_tasks_.end()) { | 118 if (image_it != image_tasks_.end()) { |
| 111 internal::WorkerPoolTask* image_task = image_it->second.get(); | 119 internal::WorkerPoolTask* image_task = image_it->second.get(); |
| 112 CreateGraphNodeForImageTask( | 120 CreateGraphNodeForImageTask( |
| 113 image_task, | 121 image_task, |
| 114 task->dependencies(), | 122 task->dependencies(), |
| 115 priority++, | 123 priority++, |
| 116 IsRasterTaskRequiredForActivation(task), | 124 IsRasterTaskRequiredForActivation(task), |
| 117 raster_required_for_activation_finished_node, | 125 raster_required_for_activation_finished_node, |
| 118 raster_finished_node, | 126 raster_finished_node, |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 145 raster_finished_node, | 153 raster_finished_node, |
| 146 &graph); | 154 &graph); |
| 147 } | 155 } |
| 148 | 156 |
| 149 SetTaskGraph(&graph); | 157 SetTaskGraph(&graph); |
| 150 | 158 |
| 151 set_raster_finished_task(new_raster_finished_task); | 159 set_raster_finished_task(new_raster_finished_task); |
| 152 set_raster_required_for_activation_finished_task( | 160 set_raster_required_for_activation_finished_task( |
| 153 new_raster_required_for_activation_finished_task); | 161 new_raster_required_for_activation_finished_task); |
| 154 | 162 |
| 163 // Run raster tasks that use GPU on impl thread. | |
| 164 RasterWorkerPool::RunGpuRasterizationTasks(gpu_rasterization_tasks); | |
|
reveman
2013/12/17 23:03:16
RasterWorkerPool:: suffix unnecessary. Move commen
alokp
2013/12/18 22:49:22
Done.
| |
| 165 for (RasterTaskVector::iterator it = gpu_rasterization_tasks.begin(); | |
| 166 it != gpu_rasterization_tasks.end(); ++it) { | |
| 167 OnRasterTaskCompleted(*it, false); | |
| 168 } | |
|
reveman
2013/12/17 23:03:16
You'll have to implement CheckForCompletedTasks an
alokp
2013/12/17 23:26:08
I am confused. Do you mean implement RasterWorkerP
reveman
2013/12/18 00:09:51
As discussed offline. TileManager calls RasterWork
alokp
2013/12/18 22:49:22
Done.
| |
| 169 | |
| 155 TRACE_EVENT_ASYNC_STEP_INTO1( | 170 TRACE_EVENT_ASYNC_STEP_INTO1( |
| 156 "cc", "ScheduledTasks", this, "rasterizing", | 171 "cc", "ScheduledTasks", this, "rasterizing", |
| 157 "state", TracedValue::FromValue(StateAsValue().release())); | 172 "state", TracedValue::FromValue(StateAsValue().release())); |
| 158 } | 173 } |
| 159 | 174 |
| 160 GLenum ImageRasterWorkerPool::GetResourceTarget() const { | 175 GLenum ImageRasterWorkerPool::GetResourceTarget() const { |
| 161 return texture_target_; | 176 return texture_target_; |
| 162 } | 177 } |
| 163 | 178 |
| 164 ResourceFormat ImageRasterWorkerPool::GetResourceFormat() const { | 179 ResourceFormat ImageRasterWorkerPool::GetResourceFormat() const { |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 180 "state", TracedValue::FromValue(StateAsValue().release())); | 195 "state", TracedValue::FromValue(StateAsValue().release())); |
| 181 client()->DidFinishRunningTasksRequiredForActivation(); | 196 client()->DidFinishRunningTasksRequiredForActivation(); |
| 182 } | 197 } |
| 183 | 198 |
| 184 void ImageRasterWorkerPool::OnRasterTaskCompleted( | 199 void ImageRasterWorkerPool::OnRasterTaskCompleted( |
| 185 scoped_refptr<internal::RasterWorkerPoolTask> task, | 200 scoped_refptr<internal::RasterWorkerPoolTask> task, |
| 186 bool was_canceled) { | 201 bool was_canceled) { |
| 187 TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted", | 202 TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted", |
| 188 "was_canceled", was_canceled); | 203 "was_canceled", was_canceled); |
| 189 | 204 |
| 190 DCHECK(image_tasks_.find(task.get()) != image_tasks_.end()); | 205 if (task->use_gpu_rasterization()) { |
|
reveman
2013/12/17 23:03:16
Hm, as you're not running gpu raster in the thread
alokp
2013/12/17 23:26:08
Sorry. I am confused. Are you suggesting not calli
reveman
2013/12/18 00:09:51
I missed that you were calling this function direc
alokp
2013/12/18 22:49:22
Done.
| |
| 191 | 206 // GPU rasterization tasks are not wrapped into image tasks. |
| 192 // Balanced with MapImage() call in ScheduleTasks(). | 207 DCHECK(image_tasks_.find(task.get()) == image_tasks_.end()); |
| 193 resource_provider()->UnmapImage(task->resource()->id()); | 208 } else { |
| 209 DCHECK(image_tasks_.find(task.get()) != image_tasks_.end()); | |
| 210 // Balanced with MapImage() call in ScheduleTasks(). | |
| 211 resource_provider()->UnmapImage(task->resource()->id()); | |
| 212 image_tasks_.erase(task.get()); | |
| 213 } | |
| 194 | 214 |
| 195 task->DidRun(was_canceled); | 215 task->DidRun(was_canceled); |
| 196 task->WillComplete(); | 216 task->WillComplete(); |
| 197 task->CompleteOnOriginThread(); | 217 task->CompleteOnOriginThread(); |
| 198 task->DidComplete(); | 218 task->DidComplete(); |
| 199 | |
| 200 image_tasks_.erase(task.get()); | |
| 201 } | 219 } |
| 202 | 220 |
| 203 scoped_ptr<base::Value> ImageRasterWorkerPool::StateAsValue() const { | 221 scoped_ptr<base::Value> ImageRasterWorkerPool::StateAsValue() const { |
| 204 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue); | 222 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue); |
| 205 | 223 |
| 206 state->SetBoolean("tasks_required_for_activation_pending", | 224 state->SetBoolean("tasks_required_for_activation_pending", |
| 207 raster_tasks_required_for_activation_pending_); | 225 raster_tasks_required_for_activation_pending_); |
| 208 state->Set("scheduled_state", ScheduledStateAsValue().release()); | 226 state->Set("scheduled_state", ScheduledStateAsValue().release()); |
| 209 return state.PassAs<base::Value>(); | 227 return state.PassAs<base::Value>(); |
| 210 } | 228 } |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 226 if (is_required_for_activation) { | 244 if (is_required_for_activation) { |
| 227 raster_required_for_activation_finished_node->add_dependency(); | 245 raster_required_for_activation_finished_node->add_dependency(); |
| 228 image_node->add_dependent(raster_required_for_activation_finished_node); | 246 image_node->add_dependent(raster_required_for_activation_finished_node); |
| 229 } | 247 } |
| 230 | 248 |
| 231 raster_finished_node->add_dependency(); | 249 raster_finished_node->add_dependency(); |
| 232 image_node->add_dependent(raster_finished_node); | 250 image_node->add_dependent(raster_finished_node); |
| 233 } | 251 } |
| 234 | 252 |
| 235 } // namespace cc | 253 } // namespace cc |
| OLD | NEW |