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

Side by Side Diff: cc/raster_worker.cc

Issue 11593030: cc: Add RasterWorkerPool class. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years 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
(Empty)
1 // Copyright 2012 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/raster_worker.h"
6
7 #include <algorithm>
8
9 #include "base/bind.h"
10 #include "base/debug/trace_event.h"
11 #include "base/stringprintf.h"
12 #include "cc/picture_pile_impl.h"
13 #include "third_party/skia/include/core/SkDevice.h"
14
15 namespace cc {
16
17 namespace {
18
19 void RunRasterTask(PicturePileImpl* picture_pile,
20 uint8_t* buffer,
21 const gfx::Rect& rect,
22 float contents_scale,
23 RenderingStats* stats) {
24 TRACE_EVENT0("cc", "RunRasterTask");
25 DCHECK(picture_pile);
26 DCHECK(buffer);
27 SkBitmap bitmap;
28 bitmap.setConfig(SkBitmap::kARGB_8888_Config, rect.width(), rect.height());
29 bitmap.setPixels(buffer);
30 SkDevice device(bitmap);
31 SkCanvas canvas(&device);
32 picture_pile->Raster(&canvas, rect, contents_scale, stats);
33 }
34
35 void OnRasterTaskCompleted(scoped_refptr<PicturePileImpl> picture_pile_clone,
36 const base::Closure& reply) {
37 reply.Run();
38 }
39
40 void RunImageDecodeTask(skia::LazyPixelRef* pixel_ref, RenderingStats* stats) {
41 TRACE_EVENT0("cc", "RunImageDecodeTask");
42 base::TimeTicks decode_begin_time = base::TimeTicks::Now();
43 pixel_ref->Decode();
44 stats->totalDeferredImageDecodeCount++;
45 stats->totalDeferredImageDecodeTimeInSeconds +=
46 (base::TimeTicks::Now() - decode_begin_time).InSecondsF();
47 }
48
49 const char* kRasterThreadNamePrefix = "CompositorRaster";
50
51 // Allow two pending raster tasks per thread. This keeps resource usage
52 // low while making sure raster threads aren't unnecessarily idle.
53 const int kNumPendingRasterTasksPerThread = 2;
54
55 } // namespace
56
57 RasterWorker::Thread::Thread(const std::string name)
58 : base::Thread(name.c_str()),
59 num_pending_tasks_(0) {
60 Start();
61 }
62
63 RasterWorker::Thread::~Thread() {
64 Stop();
65 }
66
67 RasterWorker::RasterWorker(size_t num_raster_threads) {
68 const std::string thread_name_prefix = kRasterThreadNamePrefix;
69 while (raster_threads_.size() < num_raster_threads) {
70 int thread_number = raster_threads_.size() + 1;
71 raster_threads_.append(
72 make_scoped_ptr(
73 new Thread(thread_name_prefix +
74 StringPrintf("Worker%d", thread_number).c_str())));
75 }
76 }
77
78 RasterWorker::~RasterWorker() {
79 }
80
81 bool RasterWorker::IsBusy() {
82 Thread* thread = raster_threads_.first();
83 return thread->num_pending_tasks_ >= kNumPendingRasterTasksPerThread;
84 }
85
86 void RasterWorker::PostRasterTaskAndReply(PicturePileImpl* picture_pile,
87 uint8_t* buffer,
88 const gfx::Rect& rect,
89 float contents_scale,
90 const base::Closure& reply) {
91 Thread* thread = raster_threads_.first();
92
93 scoped_refptr<PicturePileImpl> picture_pile_clone =
94 picture_pile->GetCloneForDrawingOnThread(thread);
95
96 PostTaskAndReply(base::Bind(&RunRasterTask,
97 base::Unretained(picture_pile_clone.get()),
98 buffer,
99 rect,
100 contents_scale),
101 base::Bind(&OnRasterTaskCompleted,
102 picture_pile_clone,
103 reply));
104 }
105
106 void RasterWorker::PostImageDecodingTaskAndReply(
107 skia::LazyPixelRef* pixel_ref,
108 const base::Closure& reply) {
109 PostTaskAndReply(base::Bind(&RunImageDecodeTask, pixel_ref), reply);
110 }
111
112 void RasterWorker::PostTaskAndReply(const TaskCallback& task,
113 const base::Closure& reply) {
114 Thread* thread = raster_threads_.first();
115 DCHECK(thread->num_pending_tasks_ < kNumPendingRasterTasksPerThread);
116 thread->num_pending_tasks_++;
117 std::sort(raster_threads_.begin(), raster_threads_.end(),
118 PendingTaskComparator());
119
120 RenderingStats* stats = new RenderingStats;
121 thread->message_loop_proxy()->PostTaskAndReply(
122 FROM_HERE,
123 base::Bind(&RasterWorker::RunTaskOnRasterThread,
124 base::Unretained(this),
125 task,
126 stats),
127 base::Bind(&RasterWorker::OnTaskCompleted,
128 base::Unretained(this),
129 thread,
130 stats,
131 reply));
132 }
133
134 void RasterWorker::RunTaskOnRasterThread(
135 const RasterWorker::TaskCallback& task, RenderingStats* stats) {
136 task.Run(stats);
137 }
138
139 void RasterWorker::OnTaskCompleted(Thread* thread,
140 RenderingStats* stats,
141 const base::Closure& reply) {
142 // Update rendering stats.
143 rendering_stats_.totalRasterizeTimeInSeconds +=
144 stats->totalRasterizeTimeInSeconds;
145 rendering_stats_.totalPixelsRasterized += stats->totalPixelsRasterized;
146 rendering_stats_.totalDeferredImageDecodeTimeInSeconds +=
147 stats->totalDeferredImageDecodeTimeInSeconds;
148 rendering_stats_.totalDeferredImageDecodeCount +=
149 stats->totalDeferredImageDecodeCount;
150 delete stats;
151
152 thread->num_pending_tasks_--;
153 std::sort(raster_threads_.begin(), raster_threads_.end(),
154 PendingTaskComparator());
155
156 reply.Run();
157 }
158
159 void RasterWorker::GetRenderingStats(RenderingStats* stats) {
160 stats->totalRasterizeTimeInSeconds =
161 rendering_stats_.totalRasterizeTimeInSeconds;
162 stats->totalPixelsRasterized = rendering_stats_.totalPixelsRasterized;
163 stats->totalDeferredImageDecodeCount =
164 rendering_stats_.totalDeferredImageDecodeCount;
165 stats->totalDeferredImageDecodeTimeInSeconds =
166 rendering_stats_.totalDeferredImageDecodeTimeInSeconds;
167 }
168
169 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698