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

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

Issue 157293002: cc: Refactor WorkerPoolTaskClient::AcquireBufferForRaster (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: implement acquire/release/map/unmap 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/raster_worker_pool.h" 5 #include "cc/resources/raster_worker_pool.h"
6 6
7 #include "base/debug/trace_event_synthetic_delay.h" 7 #include "base/debug/trace_event_synthetic_delay.h"
8 #include "base/json/json_writer.h" 8 #include "base/json/json_writer.h"
9 #include "base/lazy_instance.h" 9 #include "base/lazy_instance.h"
10 #include "base/metrics/histogram.h" 10 #include "base/metrics/histogram.h"
11 #include "base/strings/stringprintf.h" 11 #include "base/strings/stringprintf.h"
12 #include "base/values.h" 12 #include "base/values.h"
13 #include "cc/debug/devtools_instrumentation.h" 13 #include "cc/debug/devtools_instrumentation.h"
14 #include "cc/debug/traced_value.h" 14 #include "cc/debug/traced_value.h"
15 #include "cc/resources/picture_pile_impl.h" 15 #include "cc/resources/picture_pile_impl.h"
16 #include "cc/resources/resource.h" 16 #include "cc/resources/resource.h"
17 #include "cc/resources/resource_provider.h" 17 #include "cc/resources/resource_provider.h"
18 #include "gpu/command_buffer/client/gles2_interface.h" 18 #include "gpu/command_buffer/client/gles2_interface.h"
19 #include "skia/ext/paint_simplifier.h" 19 #include "skia/ext/paint_simplifier.h"
20 #include "third_party/skia/include/core/SkBitmap.h" 20 #include "third_party/skia/include/core/SkBitmap.h"
21 #include "third_party/skia/include/core/SkPixelRef.h" 21 #include "third_party/skia/include/core/SkPixelRef.h"
22 #include "third_party/skia/include/gpu/GrContext.h" 22 #include "third_party/skia/include/gpu/GrContext.h"
23 #include "third_party/skia/include/gpu/SkGpuDevice.h"
24 23
25 namespace cc { 24 namespace cc {
26 namespace { 25 namespace {
27 26
28 // Subclass of Allocator that takes a suitably allocated pointer and uses 27 // Subclass of Allocator that takes a suitably allocated pointer and uses
29 // it as the pixel memory for the bitmap. 28 // it as the pixel memory for the bitmap.
30 class IdentityAllocator : public SkBitmap::Allocator { 29 class IdentityAllocator : public SkBitmap::Allocator {
31 public: 30 public:
32 explicit IdentityAllocator(void* buffer) : buffer_(buffer) {} 31 explicit IdentityAllocator(void* buffer) : buffer_(buffer) {}
33 virtual bool allocPixelRef(SkBitmap* dst, SkColorTable*) OVERRIDE { 32 virtual bool allocPixelRef(SkBitmap* dst, SkColorTable*) OVERRIDE {
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 picture_pile_(picture_pile), 86 picture_pile_(picture_pile),
88 content_rect_(content_rect), 87 content_rect_(content_rect),
89 contents_scale_(contents_scale), 88 contents_scale_(contents_scale),
90 raster_mode_(raster_mode), 89 raster_mode_(raster_mode),
91 tile_resolution_(tile_resolution), 90 tile_resolution_(tile_resolution),
92 layer_id_(layer_id), 91 layer_id_(layer_id),
93 tile_id_(tile_id), 92 tile_id_(tile_id),
94 source_frame_number_(source_frame_number), 93 source_frame_number_(source_frame_number),
95 rendering_stats_(rendering_stats), 94 rendering_stats_(rendering_stats),
96 reply_(reply), 95 reply_(reply),
97 buffer_(NULL), 96 canvas_(NULL) {}
98 stride_(0) {}
99 97
100 void RunAnalysisOnThread(unsigned thread_index) { 98 void RunAnalysisOnThread(unsigned thread_index) {
101 TRACE_EVENT1("cc", 99 TRACE_EVENT1("cc",
102 "RasterWorkerPoolTaskImpl::RunAnalysisOnThread", 100 "RasterWorkerPoolTaskImpl::RunAnalysisOnThread",
103 "data", 101 "data",
104 TracedValue::FromValue(DataAsValue().release())); 102 TracedValue::FromValue(DataAsValue().release()));
105 103
106 DCHECK(picture_pile_.get()); 104 DCHECK(picture_pile_.get());
107 DCHECK(rendering_stats_); 105 DCHECK(rendering_stats_);
108 106
109 PicturePileImpl* picture_clone = 107 PicturePileImpl* picture_clone =
110 picture_pile_->GetCloneForDrawingOnThread(thread_index); 108 picture_pile_->GetCloneForDrawingOnThread(thread_index);
111 109
112 DCHECK(picture_clone); 110 DCHECK(picture_clone);
113 111
114 picture_clone->AnalyzeInRect( 112 picture_clone->AnalyzeInRect(
115 content_rect_, contents_scale_, &analysis_, rendering_stats_); 113 content_rect_, contents_scale_, &analysis_, rendering_stats_);
116 114
117 // Record the solid color prediction. 115 // Record the solid color prediction.
118 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed", 116 UMA_HISTOGRAM_BOOLEAN("Renderer4.SolidColorTilesAnalyzed",
119 analysis_.is_solid_color); 117 analysis_.is_solid_color);
120 118
121 // Clear the flag if we're not using the estimator. 119 // Clear the flag if we're not using the estimator.
122 analysis_.is_solid_color &= kUseColorEstimator; 120 analysis_.is_solid_color &= kUseColorEstimator;
123 } 121 }
124 122
125 void RunRasterOnThread(unsigned thread_index, 123 void RunRasterOnThread(unsigned thread_index) {
126 void* buffer,
127 const gfx::Size& size,
128 int stride) {
129 TRACE_EVENT2( 124 TRACE_EVENT2(
130 "cc", 125 "cc",
131 "RasterWorkerPoolTaskImpl::RunRasterOnThread", 126 "RasterWorkerPoolTaskImpl::RunRasterOnThread",
132 "data", 127 "data",
133 TracedValue::FromValue(DataAsValue().release()), 128 TracedValue::FromValue(DataAsValue().release()),
134 "raster_mode", 129 "raster_mode",
135 TracedValue::FromValue(RasterModeAsValue(raster_mode_).release())); 130 TracedValue::FromValue(RasterModeAsValue(raster_mode_).release()));
136 131
137 devtools_instrumentation::ScopedLayerTask raster_task( 132 devtools_instrumentation::ScopedLayerTask raster_task(
138 devtools_instrumentation::kRasterTask, layer_id_); 133 devtools_instrumentation::kRasterTask, layer_id_);
139 134
140 DCHECK(picture_pile_.get()); 135 DCHECK(picture_pile_.get());
141 DCHECK(buffer); 136 Raster(picture_pile_->GetCloneForDrawingOnThread(thread_index));
142
143 SkBitmap bitmap;
144 switch (resource()->format()) {
145 case RGBA_4444:
146 // Use the default stride if we will eventually convert this
147 // bitmap to 4444.
148 bitmap.setConfig(
149 SkBitmap::kARGB_8888_Config, size.width(), size.height());
150 bitmap.allocPixels();
151 break;
152 case RGBA_8888:
153 case BGRA_8888:
154 bitmap.setConfig(
155 SkBitmap::kARGB_8888_Config, size.width(), size.height(), stride);
156 bitmap.setPixels(buffer);
157 break;
158 case LUMINANCE_8:
159 case RGB_565:
160 case ETC1:
161 NOTREACHED();
162 break;
163 }
164
165 SkBitmapDevice device(bitmap);
166 SkCanvas canvas(&device);
167 Raster(picture_pile_->GetCloneForDrawingOnThread(thread_index), &canvas);
168 ChangeBitmapConfigIfNeeded(bitmap, buffer);
169 } 137 }
170 138
171 // Overridden from internal::Task: 139 // Overridden from internal::Task:
172 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE { 140 virtual void RunOnWorkerThread(unsigned thread_index) OVERRIDE {
173 // TODO(alokp): For now run-on-worker-thread implies software rasterization. 141 // TODO(alokp): For now run-on-worker-thread implies software rasterization.
174 DCHECK(!use_gpu_rasterization()); 142 DCHECK(!use_gpu_rasterization());
175 RunAnalysisOnThread(thread_index); 143 RunAnalysisOnThread(thread_index);
176 if (buffer_ && !analysis_.is_solid_color) 144 if (canvas_ && !analysis_.is_solid_color)
177 RunRasterOnThread(thread_index, buffer_, resource()->size(), stride_); 145 RunRasterOnThread(thread_index);
178 } 146 }
179 147
180 // Overridden from internal::WorkerPoolTask: 148 // Overridden from internal::WorkerPoolTask:
181 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client) 149 virtual void ScheduleOnOriginThread(internal::WorkerPoolTaskClient* client)
182 OVERRIDE { 150 OVERRIDE {
183 if (use_gpu_rasterization()) 151 DCHECK(!canvas_);
184 return; 152 canvas_ = client->AcquireCanvasForRaster(this);
185 DCHECK(!buffer_);
186 buffer_ = client->AcquireBufferForRaster(this, &stride_);
187 } 153 }
188 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client) 154 virtual void CompleteOnOriginThread(internal::WorkerPoolTaskClient* client)
189 OVERRIDE { 155 OVERRIDE {
190 if (use_gpu_rasterization()) 156 canvas_ = NULL;
191 return;
192 buffer_ = NULL;
193 client->OnRasterCompleted(this, analysis_); 157 client->OnRasterCompleted(this, analysis_);
194 } 158 }
195 virtual void RunReplyOnOriginThread() OVERRIDE { 159 virtual void RunReplyOnOriginThread() OVERRIDE {
196 DCHECK(!buffer_); 160 DCHECK(!canvas_);
197 reply_.Run(analysis_, !HasFinishedRunning()); 161 reply_.Run(analysis_, !HasFinishedRunning());
198 } 162 }
199 163
200 // Overridden from internal::RasterWorkerPoolTask: 164 // Overridden from internal::RasterWorkerPoolTask:
201 virtual void RunOnOriginThread(ResourceProvider* resource_provider, 165 virtual void RunOnOriginThread(ResourceProvider* resource_provider,
202 ContextProvider* context_provider) OVERRIDE { 166 ContextProvider* context_provider) OVERRIDE {
203 // TODO(alokp): Use a trace macro to push/pop markers. 167 // TODO(alokp): Use a trace macro to push/pop markers.
204 // Using push/pop functions directly incurs cost to evaluate function 168 // Using push/pop functions directly incurs cost to evaluate function
205 // arguments even when tracing is disabled. 169 // arguments even when tracing is disabled.
206 context_provider->ContextGL()->PushGroupMarkerEXT( 170 context_provider->ContextGL()->PushGroupMarkerEXT(
207 0, 171 0,
208 base::StringPrintf( 172 base::StringPrintf(
209 "Raster-%d-%d-%p", source_frame_number_, layer_id_, tile_id_) 173 "Raster-%d-%d-%p", source_frame_number_, layer_id_, tile_id_)
210 .c_str()); 174 .c_str());
211 // TODO(alokp): For now run-on-origin-thread implies gpu rasterization. 175 // TODO(alokp): For now run-on-origin-thread implies gpu rasterization.
212 DCHECK(use_gpu_rasterization()); 176 DCHECK(use_gpu_rasterization());
213 ResourceProvider::ScopedWriteLockGL lock(resource_provider, 177 Raster(picture_pile_);
214 resource()->id());
215 DCHECK_NE(lock.texture_id(), 0u);
216
217 GrBackendTextureDesc desc;
218 desc.fFlags = kRenderTarget_GrBackendTextureFlag;
219 desc.fWidth = content_rect_.width();
220 desc.fHeight = content_rect_.height();
221 desc.fConfig = ToGrFormat(resource()->format());
222 desc.fOrigin = kTopLeft_GrSurfaceOrigin;
223 desc.fTextureHandle = lock.texture_id();
224
225 GrContext* gr_context = context_provider->GrContext();
226 skia::RefPtr<GrTexture> texture =
227 skia::AdoptRef(gr_context->wrapBackendTexture(desc));
228 skia::RefPtr<SkGpuDevice> device =
229 skia::AdoptRef(SkGpuDevice::Create(texture.get()));
230 skia::RefPtr<SkCanvas> canvas = skia::AdoptRef(new SkCanvas(device.get()));
231
232 Raster(picture_pile_, canvas.get());
233 context_provider->ContextGL()->PopGroupMarkerEXT(); 178 context_provider->ContextGL()->PopGroupMarkerEXT();
234 } 179 }
235 180
236 protected: 181 protected:
237 virtual ~RasterWorkerPoolTaskImpl() { DCHECK(!buffer_); } 182 virtual ~RasterWorkerPoolTaskImpl() { DCHECK(!canvas_); }
238 183
239 private: 184 private:
240 scoped_ptr<base::Value> DataAsValue() const { 185 scoped_ptr<base::Value> DataAsValue() const {
241 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue()); 186 scoped_ptr<base::DictionaryValue> res(new base::DictionaryValue());
242 res->Set("tile_id", TracedValue::CreateIDRef(tile_id_).release()); 187 res->Set("tile_id", TracedValue::CreateIDRef(tile_id_).release());
243 res->Set("resolution", TileResolutionAsValue(tile_resolution_).release()); 188 res->Set("resolution", TileResolutionAsValue(tile_resolution_).release());
244 res->SetInteger("source_frame_number", source_frame_number_); 189 res->SetInteger("source_frame_number", source_frame_number_);
245 res->SetInteger("layer_id", layer_id_); 190 res->SetInteger("layer_id", layer_id_);
246 return res.PassAs<base::Value>(); 191 return res.PassAs<base::Value>();
247 } 192 }
248 193
249 static GrPixelConfig ToGrFormat(ResourceFormat format) { 194 void Raster(PicturePileImpl* picture_pile) {
250 switch (format) {
251 case RGBA_8888:
252 return kRGBA_8888_GrPixelConfig;
253 case BGRA_8888:
254 return kBGRA_8888_GrPixelConfig;
255 case RGBA_4444:
256 return kRGBA_4444_GrPixelConfig;
257 default:
258 break;
259 }
260 DCHECK(false) << "Unsupported resource format.";
261 return kSkia8888_GrPixelConfig;
262 }
263
264 void Raster(PicturePileImpl* picture_pile, SkCanvas* canvas) {
265 skia::RefPtr<SkDrawFilter> draw_filter; 195 skia::RefPtr<SkDrawFilter> draw_filter;
266 switch (raster_mode_) { 196 switch (raster_mode_) {
267 case LOW_QUALITY_RASTER_MODE: 197 case LOW_QUALITY_RASTER_MODE:
268 draw_filter = skia::AdoptRef(new skia::PaintSimplifier); 198 draw_filter = skia::AdoptRef(new skia::PaintSimplifier);
269 break; 199 break;
270 case HIGH_QUALITY_NO_LCD_RASTER_MODE: 200 case HIGH_QUALITY_NO_LCD_RASTER_MODE:
271 draw_filter = skia::AdoptRef(new DisableLCDTextFilter); 201 draw_filter = skia::AdoptRef(new DisableLCDTextFilter);
272 break; 202 break;
273 case HIGH_QUALITY_RASTER_MODE: 203 case HIGH_QUALITY_RASTER_MODE:
274 break; 204 break;
275 case NUM_RASTER_MODES: 205 case NUM_RASTER_MODES:
276 default: 206 default:
277 NOTREACHED(); 207 NOTREACHED();
278 } 208 }
279 canvas->setDrawFilter(draw_filter.get()); 209 canvas_->setDrawFilter(draw_filter.get());
280 210
281 base::TimeDelta prev_rasterize_time = 211 base::TimeDelta prev_rasterize_time =
282 rendering_stats_->impl_thread_rendering_stats().rasterize_time; 212 rendering_stats_->impl_thread_rendering_stats().rasterize_time;
283 213
284 // Only record rasterization time for highres tiles, because 214 // Only record rasterization time for highres tiles, because
285 // lowres tiles are not required for activation and therefore 215 // lowres tiles are not required for activation and therefore
286 // introduce noise in the measurement (sometimes they get rasterized 216 // introduce noise in the measurement (sometimes they get rasterized
287 // before we draw and sometimes they aren't) 217 // before we draw and sometimes they aren't)
288 RenderingStatsInstrumentation* stats = 218 RenderingStatsInstrumentation* stats =
289 tile_resolution_ == HIGH_RESOLUTION ? rendering_stats_ : NULL; 219 tile_resolution_ == HIGH_RESOLUTION ? rendering_stats_ : NULL;
290 picture_pile->RasterToBitmap(canvas, content_rect_, contents_scale_, stats); 220 picture_pile->RasterToBitmap(
221 canvas_, content_rect_, contents_scale_, stats);
291 222
292 if (rendering_stats_->record_rendering_stats()) { 223 if (rendering_stats_->record_rendering_stats()) {
293 base::TimeDelta current_rasterize_time = 224 base::TimeDelta current_rasterize_time =
294 rendering_stats_->impl_thread_rendering_stats().rasterize_time; 225 rendering_stats_->impl_thread_rendering_stats().rasterize_time;
295 HISTOGRAM_CUSTOM_COUNTS( 226 HISTOGRAM_CUSTOM_COUNTS(
296 "Renderer4.PictureRasterTimeUS", 227 "Renderer4.PictureRasterTimeUS",
297 (current_rasterize_time - prev_rasterize_time).InMicroseconds(), 228 (current_rasterize_time - prev_rasterize_time).InMicroseconds(),
298 0, 229 0,
299 100000, 230 100000,
300 100); 231 100);
301 } 232 }
302 } 233 }
303 234
304 void ChangeBitmapConfigIfNeeded(const SkBitmap& bitmap, void* buffer) {
305 TRACE_EVENT0("cc", "RasterWorkerPoolTaskImpl::ChangeBitmapConfigIfNeeded");
306 SkBitmap::Config config = SkBitmapConfig(resource()->format());
307 if (bitmap.getConfig() != config) {
308 SkBitmap bitmap_dest;
309 IdentityAllocator allocator(buffer);
310 bitmap.copyTo(&bitmap_dest, config, &allocator);
311 // TODO(kaanb): The GL pipeline assumes a 4-byte alignment for the
312 // bitmap data. This check will be removed once crbug.com/293728 is fixed.
313 CHECK_EQ(0u, bitmap_dest.rowBytes() % 4);
314 }
315 }
reveman 2014/02/11 02:00:44 Where does this bitmap conversion code go?
alokp 2014/02/11 07:05:21 It somehow got lost while moving code! Added in Bi
316
317 PicturePileImpl::Analysis analysis_; 235 PicturePileImpl::Analysis analysis_;
318 scoped_refptr<PicturePileImpl> picture_pile_; 236 scoped_refptr<PicturePileImpl> picture_pile_;
319 gfx::Rect content_rect_; 237 gfx::Rect content_rect_;
320 float contents_scale_; 238 float contents_scale_;
321 RasterMode raster_mode_; 239 RasterMode raster_mode_;
322 TileResolution tile_resolution_; 240 TileResolution tile_resolution_;
323 int layer_id_; 241 int layer_id_;
324 const void* tile_id_; 242 const void* tile_id_;
325 int source_frame_number_; 243 int source_frame_number_;
326 RenderingStatsInstrumentation* rendering_stats_; 244 RenderingStatsInstrumentation* rendering_stats_;
327 const RasterWorkerPool::RasterTask::Reply reply_; 245 const RasterWorkerPool::RasterTask::Reply reply_;
328 void* buffer_; 246 SkCanvas* canvas_;
329 int stride_;
330 247
331 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl); 248 DISALLOW_COPY_AND_ASSIGN(RasterWorkerPoolTaskImpl);
332 }; 249 };
333 250
334 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask { 251 class ImageDecodeWorkerPoolTaskImpl : public internal::WorkerPoolTask {
335 public: 252 public:
336 ImageDecodeWorkerPoolTaskImpl(SkPixelRef* pixel_ref, 253 ImageDecodeWorkerPoolTaskImpl(SkPixelRef* pixel_ref,
337 int layer_id, 254 int layer_id,
338 RenderingStatsInstrumentation* rendering_stats, 255 RenderingStatsInstrumentation* rendering_stats,
339 const RasterWorkerPool::Task::Reply& reply) 256 const RasterWorkerPool::Task::Reply& reply)
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 // static 526 // static
610 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask( 527 RasterWorkerPool::Task RasterWorkerPool::CreateImageDecodeTask(
611 SkPixelRef* pixel_ref, 528 SkPixelRef* pixel_ref,
612 int layer_id, 529 int layer_id,
613 RenderingStatsInstrumentation* rendering_stats, 530 RenderingStatsInstrumentation* rendering_stats,
614 const Task::Reply& reply) { 531 const Task::Reply& reply) {
615 return Task(new ImageDecodeWorkerPoolTaskImpl( 532 return Task(new ImageDecodeWorkerPoolTaskImpl(
616 pixel_ref, layer_id, rendering_stats, reply)); 533 pixel_ref, layer_id, rendering_stats, reply));
617 } 534 }
618 535
536 SkCanvas* RasterWorkerPool::AcquireCanvasForRaster(
537 internal::RasterWorkerPoolTask* task) {
538 DCHECK(task->use_gpu_rasterization());
539 return resource_provider()->MapDirectRasterBuffer(task->resource()->id());
540 }
541
542 void RasterWorkerPool::OnRasterCompleted(
543 internal::RasterWorkerPoolTask* task,
544 const PicturePileImpl::Analysis& analysis) {
545 DCHECK(task->use_gpu_rasterization());
546 resource_provider()->UnmapDirectRasterBuffer(task->resource()->id());
547 }
reveman 2014/02/11 02:00:44 I think RasterWorkerPool should be an interface an
alokp 2014/02/11 07:05:21 Done.
548
619 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) { 549 void RasterWorkerPool::SetClient(RasterWorkerPoolClient* client) {
620 client_ = client; 550 client_ = client;
621 } 551 }
622 552
623 void RasterWorkerPool::Shutdown() { 553 void RasterWorkerPool::Shutdown() {
624 TRACE_EVENT0("cc", "RasterWorkerPool::Shutdown"); 554 TRACE_EVENT0("cc", "RasterWorkerPool::Shutdown");
625 555
626 raster_tasks_.clear(); 556 raster_tasks_.clear();
627 internal::TaskGraph empty; 557 internal::TaskGraph empty;
628 SetTaskGraph(&empty); 558 SetTaskGraph(&empty);
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 if (decode_it == graph->nodes.end()) 733 if (decode_it == graph->nodes.end())
804 InsertNodeForTask(graph, decode_task, priority, 0u); 734 InsertNodeForTask(graph, decode_task, priority, 0u);
805 735
806 graph->edges.push_back(internal::TaskGraph::Edge(decode_task, raster_task)); 736 graph->edges.push_back(internal::TaskGraph::Edge(decode_task, raster_task));
807 } 737 }
808 738
809 InsertNodeForTask(graph, raster_task, priority, dependencies); 739 InsertNodeForTask(graph, raster_task, priority, dependencies);
810 } 740 }
811 741
812 } // namespace cc 742 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698