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

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

Issue 15860003: AW hardware draw mega patch (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: r205552 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 | Annotate | Revision Log
« no previous file with comments | « cc/resources/image_raster_worker_pool.h ('k') | cc/resources/prioritized_resource_manager.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 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 "cc/resources/resource.h" 8 #include "cc/resources/resource.h"
9 #include "third_party/skia/include/core/SkDevice.h" 9 #include "third_party/skia/include/core/SkDevice.h"
10 10
11 namespace cc { 11 namespace cc {
12 12
13 namespace { 13 namespace {
14 14
15 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask { 15 class ImageWorkerPoolTaskImpl : public internal::WorkerPoolTask {
16 public: 16 public:
17 typedef base::Callback<void(bool was_canceled)> Reply; 17 typedef base::Callback<void(bool was_canceled, bool map_image_successful)>
18 Reply;
18 19
19 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task, 20 ImageWorkerPoolTaskImpl(internal::RasterWorkerPoolTask* task,
20 TaskVector* dependencies, 21 TaskVector* dependencies,
21 uint8_t* buffer, 22 uint8_t* buffer,
22 int stride, 23 int stride,
23 const Reply& reply) 24 const Reply& reply)
24 : internal::WorkerPoolTask(dependencies), 25 : internal::WorkerPoolTask(dependencies),
25 task_(task), 26 task_(task),
26 buffer_(buffer), 27 buffer_(buffer),
27 stride_(stride), 28 stride_(stride),
28 reply_(reply) { 29 reply_(reply) {
29 } 30 }
30 31
31 // Overridden from internal::WorkerPoolTask: 32 // Overridden from internal::WorkerPoolTask:
32 virtual void RunOnThread(unsigned thread_index) OVERRIDE { 33 virtual void RunOnThread(unsigned thread_index) OVERRIDE {
33 DCHECK(buffer_); 34 if (!buffer_)
35 return;
36
34 SkBitmap bitmap; 37 SkBitmap bitmap;
35 bitmap.setConfig(SkBitmap::kARGB_8888_Config, 38 bitmap.setConfig(SkBitmap::kARGB_8888_Config,
36 task_->resource()->size().width(), 39 task_->resource()->size().width(),
37 task_->resource()->size().height(), 40 task_->resource()->size().height(),
38 stride_); 41 stride_);
39 bitmap.setPixels(buffer_); 42 bitmap.setPixels(buffer_);
40 SkDevice device(bitmap); 43 SkDevice device(bitmap);
41 task_->RunOnThread(&device, thread_index); 44 task_->RunOnThread(&device, thread_index);
42 } 45 }
43 virtual void DispatchCompletionCallback() OVERRIDE { 46 virtual void DispatchCompletionCallback() OVERRIDE {
44 reply_.Run(!HasFinishedRunning()); 47 reply_.Run(!HasFinishedRunning(), !!buffer_);
45 } 48 }
46 49
47 private: 50 private:
48 virtual ~ImageWorkerPoolTaskImpl() {} 51 virtual ~ImageWorkerPoolTaskImpl() {}
49 52
50 scoped_refptr<internal::RasterWorkerPoolTask> task_; 53 scoped_refptr<internal::RasterWorkerPoolTask> task_;
51 uint8_t* buffer_; 54 uint8_t* buffer_;
52 int stride_; 55 int stride_;
53 const Reply reply_; 56 const Reply reply_;
54 57
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
88 internal::WorkerPoolTask* image_task = image_it->second; 91 internal::WorkerPoolTask* image_task = image_it->second;
89 tasks.push_back(image_task); 92 tasks.push_back(image_task);
90 continue; 93 continue;
91 } 94 }
92 95
93 // Acquire image for resource. 96 // Acquire image for resource.
94 resource_provider()->AcquireImage(task->resource()->id()); 97 resource_provider()->AcquireImage(task->resource()->id());
95 98
96 // Map image for raster. 99 // Map image for raster.
97 uint8* buffer = resource_provider()->MapImage(task->resource()->id()); 100 uint8* buffer = resource_provider()->MapImage(task->resource()->id());
98 int stride = resource_provider()->GetImageStride(task->resource()->id()); 101 int stride = 0;
102 if (buffer)
103 stride = resource_provider()->GetImageStride(task->resource()->id());
99 104
100 // TODO(reveman): Avoid having to make a copy of dependencies. 105 // TODO(reveman): Avoid having to make a copy of dependencies.
101 internal::WorkerPoolTask::TaskVector dependencies = task->dependencies(); 106 internal::WorkerPoolTask::TaskVector dependencies = task->dependencies();
102 scoped_refptr<internal::WorkerPoolTask> image_task( 107 scoped_refptr<internal::WorkerPoolTask> image_task(
103 new ImageWorkerPoolTaskImpl( 108 new ImageWorkerPoolTaskImpl(
104 task, 109 task,
105 &dependencies, 110 &dependencies,
106 buffer, 111 buffer,
107 stride, 112 stride,
108 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted, 113 base::Bind(&ImageRasterWorkerPool::OnRasterTaskCompleted,
109 base::Unretained(this), 114 base::Unretained(this),
110 make_scoped_refptr(task)))); 115 make_scoped_refptr(task))));
111 116
112 image_tasks_[task] = image_task; 117 image_tasks_[task] = image_task;
113 tasks.push_back(image_task); 118 tasks.push_back(image_task);
114 } 119 }
115 120
116 if (tasks.empty()) { 121 if (tasks.empty()) {
117 ScheduleRasterTasks(RootTask()); 122 ScheduleRasterTasks(RootTask());
118 return; 123 return;
119 } 124 }
120 125
121 RootTask root(&tasks); 126 RootTask root(&tasks);
122 ScheduleRasterTasks(root); 127 ScheduleRasterTasks(root);
123 } 128 }
124 129
125 void ImageRasterWorkerPool::OnRasterTaskCompleted( 130 void ImageRasterWorkerPool::OnRasterTaskCompleted(
126 scoped_refptr<internal::RasterWorkerPoolTask> task, 131 scoped_refptr<internal::RasterWorkerPoolTask> task,
127 bool was_canceled) { 132 bool was_canceled,
133 bool map_image_successful) {
128 TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted", 134 TRACE_EVENT1("cc", "ImageRasterWorkerPool::OnRasterTaskCompleted",
129 "was_canceled", was_canceled); 135 "was_canceled", was_canceled);
130 136
131 DCHECK(image_tasks_.find(task) != image_tasks_.end()); 137 DCHECK(image_tasks_.find(task) != image_tasks_.end());
132 138
133 // Balanced with MapImage() call in ScheduleTasks(). 139 if (map_image_successful) {
134 resource_provider()->UnmapImage(task->resource()->id()); 140 // Balanced with MapImage() call in ScheduleTasks().
141 resource_provider()->UnmapImage(task->resource()->id());
135 142
136 // Bind image to resource. 143 // Bind image to resource.
137 resource_provider()->BindImage(task->resource()->id()); 144 resource_provider()->BindImage(task->resource()->id());
145 }
138 146
139 if (!was_canceled) 147 if (!was_canceled)
140 task->DidRun(); 148 task->DidRun();
141 149
142 task->DidComplete(); 150 task->DidComplete();
143 task->DispatchCompletionCallback(); 151 task->DispatchCompletionCallback();
144 152
145 image_tasks_.erase(task); 153 image_tasks_.erase(task);
146 } 154 }
147 155
148 } // namespace cc 156 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/image_raster_worker_pool.h ('k') | cc/resources/prioritized_resource_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698