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

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

Issue 16190002: cc: Add new RasterWorkerPool interface. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: rebase Created 7 years, 6 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
« no previous file with comments | « cc/resources/image_raster_worker_pool.h ('k') | cc/resources/managed_tile_state.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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 #include "cc/resources/image_raster_worker_pool.h"
6
7 #include "base/debug/trace_event.h"
8 #include "cc/resources/resource.h"
9 #include "third_party/skia/include/core/SkDevice.h"
10
11 namespace cc {
12
13 namespace {
14
15 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask {
16 public:
17 typedef base::Callback<void(bool was_canceled)> Reply;
18
19 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task,
20 TaskVector* dependencies,
21 uint8_t* buffer,
22 int stride,
23 const Reply& reply)
24 : internal::WorkerPoolTask(dependencies),
25 task_(task),
26 buffer_(buffer),
27 stride_(stride),
28 reply_(reply) {
29 }
30
31 // Overridden from internal::WorkerPoolTask:
32 virtual void RunOnThread(unsigned thread_index) OVERRIDE {
33 DCHECK(buffer_);
34 SkBitmap bitmap;
35 bitmap.setConfig(SkBitmap::kARGB_8888_Config,
36 task_->resource()->size().width(),
37 task_->resource()->size().height(),
38 stride_);
39 bitmap.setPixels(buffer_);
40 SkDevice device(bitmap);
41 task_->RunOnThread(&device, thread_index);
42 }
43 virtual void DispatchCompletionCallback() OVERRIDE {
44 reply_.Run(!HasFinishedRunning());
45 }
46
47 private:
48 virtual ~ImageWorkerPoolTaskImpl() {}
49
50 scoped_refptr<internal::RasterWorkerPoolTask> task_;
51 uint8_t* buffer_;
52 int stride_;
53 const Reply reply_;
54
55 DISALLOW_COPY_AND_ASSIGN(ImageWorkerPoolTaskImpl);
56 };
57
58 } // namespace
59
60 ImageRasterWorkerPool::ImageRasterWorkerPool(
61 ResourceProvider* resource_provider, size_t num_threads)
62 : RasterWorkerPool(resource_provider, num_threads) {
63 // TODO(reveman): Remove WorkerPool client interface.
64 WorkerPool::SetClient(this);
65 }
66
67 ImageRasterWorkerPool::~ImageRasterWorkerPool() {
68 DCHECK_EQ(0u, image_tasks_.size());
69 }
70
71 void ImageRasterWorkerPool::ScheduleTasks(RasterTask::Queue* queue) {
72 TRACE_EVENT0("cc", "ImageRasterWorkerPool::ScheduleTasks");
73
74 internal::WorkerPoolTask::TaskVector raster_tasks;
75
76 RasterWorkerPool::SetRasterTasks(queue);
77
78 for (RasterTask::Queue::TaskVector::iterator it = raster_tasks_.begin();
79 it != raster_tasks_.end(); ++it) {
80 internal::RasterWorkerPoolTask* task = *it;
81
82 TaskMap::iterator image_it = image_tasks_.find(task);
83 if (image_it != image_tasks_.end()) {
84 internal::WorkerPoolTask* image_task = image_it->second;
85 raster_tasks.push_back(image_task);
86 continue;
87 }
88
89 // Acquire image for resource.
90 resource_provider_->AcquireImage(task->resource()->id());
91
92 // Map image for raster.
93 uint8* buffer = resource_provider_->MapImage(task->resource()->id());
94 int stride = resource_provider_->GetImageStride(task->resource()->id());
95
96 // TODO(reveman): Avoid having to make a copy of dependencies.
97 internal::WorkerPoolTask::TaskVector dependencies = task->dependencies();
98 scoped_refptr<internal::WorkerPoolTask> image_task(
99 new ImageWorkerPoolTaskImpl(
100 task,
101 &dependencies,
102 buffer,
103 stride,
104 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted,
105 base::Unretained(this),
106 make_scoped_refptr(task))));
107
108 image_tasks_[task] = image_task;
109 raster_tasks.push_back(image_task);
110 }
111
112 ScheduleRasterTasks(&raster_tasks);
113 }
114
115 void ImageRasterWorkerPool::OnRasterTaskCompleted(
116 scoped_refptr<internal::RasterWorkerPoolTask> task,
117 bool was_canceled) {
118 TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted",
119 "was_canceled", was_canceled);
120
121 DCHECK(image_tasks_.find(task) != image_tasks_.end());
122
123 // Balanced with MapImage() call in ScheduleTasks().
124 resource_provider_->UnmapImage(task->resource()->id());
125
126 // Bind image to resource.
127 resource_provider_->BindImage(task->resource()->id());
128
129 if (!was_canceled)
130 task->DidRun();
131
132 DidFinishRasterTask(task);
133 image_tasks_.erase(task);
134 }
135
136 void ImageRasterWorkerPool::DidFinishRasterTask(
137 internal::RasterWorkerPoolTask* task) {
138 task->DidComplete();
139 task->DispatchCompletionCallback();
140 }
141
142 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/image_raster_worker_pool.h ('k') | cc/resources/managed_tile_state.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698