OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/tiles/image_controller.h" | 5 #include "cc/tiles/image_controller.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/task_scheduler/post_task.h" | 8 #include "base/task_scheduler/post_task.h" |
9 #include "base/task_scheduler/task_traits.h" | 9 #include "base/task_scheduler/task_traits.h" |
10 #include "base/threading/thread_restrictions.h" | 10 #include "base/threading/thread_restrictions.h" |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 const ImageDecodeCache::TracingInfo& tracing_info) { | 172 const ImageDecodeCache::TracingInfo& tracing_info) { |
173 std::vector<scoped_refptr<TileTask>> new_tasks; | 173 std::vector<scoped_refptr<TileTask>> new_tasks; |
174 GetTasksForImagesAndRef(&images, &new_tasks, tracing_info); | 174 GetTasksForImagesAndRef(&images, &new_tasks, tracing_info); |
175 UnrefImages(predecode_locked_images_); | 175 UnrefImages(predecode_locked_images_); |
176 predecode_locked_images_ = std::move(images); | 176 predecode_locked_images_ = std::move(images); |
177 return new_tasks; | 177 return new_tasks; |
178 } | 178 } |
179 | 179 |
180 ImageController::ImageDecodeRequestId ImageController::QueueImageDecode( | 180 ImageController::ImageDecodeRequestId ImageController::QueueImageDecode( |
181 sk_sp<const SkImage> image, | 181 sk_sp<const SkImage> image, |
182 const ImageDecodedCallback& callback) { | 182 const ImageDecodedCallback& callback, |
| 183 ImageDecodeCache::ImageDecodeType type) { |
183 // We must not receive any image requests if we have no worker. | 184 // We must not receive any image requests if we have no worker. |
184 CHECK(worker_task_runner_); | 185 CHECK(worker_task_runner_); |
185 | 186 |
186 // Generate the next id. | 187 // Generate the next id. |
187 ImageDecodeRequestId id = s_next_image_decode_queue_id_++; | 188 ImageDecodeRequestId id = s_next_image_decode_queue_id_++; |
188 | 189 |
189 // TODO(ccameron): The target color space specified here should match the | 190 // TODO(ccameron): The target color space specified here should match the |
190 // target color space that will be used at rasterization time. Leave this | 191 // target color space that will be used at rasterization time. Leave this |
191 // unspecified now, since that will match the rasterization-time color | 192 // unspecified now, since that will match the rasterization-time color |
192 // space while color correct rendering is disabled. | 193 // space while color correct rendering is disabled. |
193 gfx::ColorSpace target_color_space; | 194 gfx::ColorSpace target_color_space; |
194 | 195 |
195 DCHECK(image); | 196 DCHECK(image); |
196 bool is_image_lazy = image->isLazyGenerated(); | 197 bool is_image_lazy = image->isLazyGenerated(); |
197 auto image_bounds = image->bounds(); | 198 auto image_bounds = image->bounds(); |
198 // TODO(khushalsagar): Eliminate the use of an incorrect id here and have all | 199 // TODO(khushalsagar): Eliminate the use of an incorrect id here and have all |
199 // call-sites provide PaintImage to the ImageController. | 200 // call-sites provide PaintImage to the ImageController. |
200 DrawImage draw_image( | 201 DrawImage draw_image( |
201 PaintImage(PaintImage::kUnknownStableId, | 202 PaintImage(PaintImage::kUnknownStableId, |
202 sk_sp<SkImage>(const_cast<SkImage*>(image.release()))), | 203 sk_sp<SkImage>(const_cast<SkImage*>(image.release()))), |
203 image_bounds, kNone_SkFilterQuality, SkMatrix::I(), target_color_space); | 204 image_bounds, kNone_SkFilterQuality, SkMatrix::I(), target_color_space); |
204 | 205 |
205 // Get the tasks for this decode. | 206 // Get the tasks for this decode. |
206 scoped_refptr<TileTask> task; | 207 scoped_refptr<TileTask> task; |
207 bool need_unref = false; | 208 bool need_unref = false; |
208 if (is_image_lazy) { | 209 if (is_image_lazy) { |
209 need_unref = | 210 need_unref = |
210 cache_->GetOutOfRasterDecodeTaskForImageAndRef(draw_image, &task); | 211 cache_->GetOutOfRasterDecodeTaskForImageAndRef(draw_image, type, &task); |
211 } | 212 } |
212 // If we don't need to unref this, we don't actually have a task. | 213 // If we don't need to unref this, we don't actually have a task. |
213 DCHECK(need_unref || !task); | 214 DCHECK(need_unref || !task); |
214 | 215 |
215 // Schedule the task and signal that there is more work. | 216 // Schedule the task and signal that there is more work. |
216 base::AutoLock hold(lock_); | 217 base::AutoLock hold(lock_); |
217 image_decode_queue_[id] = | 218 image_decode_queue_[id] = ImageDecodeRequest( |
218 ImageDecodeRequest(id, draw_image, callback, std::move(task), need_unref); | 219 id, draw_image, callback, std::move(task), need_unref, type); |
219 | 220 |
220 // If this is the only image decode request, schedule a task to run. | 221 // If this is the only image decode request, schedule a task to run. |
221 // Otherwise, the task will be scheduled in the previou task's completion. | 222 // Otherwise, the task will be scheduled in the previou task's completion. |
222 if (image_decode_queue_.size() == 1) { | 223 if (image_decode_queue_.size() == 1) { |
223 // Post a worker task. | 224 // Post a worker task. |
224 worker_task_runner_->PostTask( | 225 worker_task_runner_->PostTask( |
225 FROM_HERE, | 226 FROM_HERE, |
226 base::BindOnce(&ImageController::ProcessNextImageDecodeOnWorkerThread, | 227 base::BindOnce(&ImageController::ProcessNextImageDecodeOnWorkerThread, |
227 base::Unretained(this))); | 228 base::Unretained(this))); |
228 } | 229 } |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
339 DCHECK_EQ(0u, image_decode_queue_.size()); | 340 DCHECK_EQ(0u, image_decode_queue_.size()); |
340 DCHECK_EQ(0u, requests_needing_completion_.size()); | 341 DCHECK_EQ(0u, requests_needing_completion_.size()); |
341 DCHECK(cache_); | 342 DCHECK(cache_); |
342 | 343 |
343 for (auto& request : orphaned_decode_requests_) { | 344 for (auto& request : orphaned_decode_requests_) { |
344 DCHECK(!request.task); | 345 DCHECK(!request.task); |
345 DCHECK(!request.need_unref); | 346 DCHECK(!request.need_unref); |
346 if (request.draw_image.image()->isLazyGenerated()) { | 347 if (request.draw_image.image()->isLazyGenerated()) { |
347 // Get the task for this decode. | 348 // Get the task for this decode. |
348 request.need_unref = cache_->GetOutOfRasterDecodeTaskForImageAndRef( | 349 request.need_unref = cache_->GetOutOfRasterDecodeTaskForImageAndRef( |
349 request.draw_image, &request.task); | 350 request.draw_image, request.decode_type, &request.task); |
350 } | 351 } |
351 image_decode_queue_[request.id] = std::move(request); | 352 image_decode_queue_[request.id] = std::move(request); |
352 } | 353 } |
353 | 354 |
354 orphaned_decode_requests_.clear(); | 355 orphaned_decode_requests_.clear(); |
355 if (!image_decode_queue_.empty()) { | 356 if (!image_decode_queue_.empty()) { |
356 // Post a worker task. | 357 // Post a worker task. |
357 worker_task_runner_->PostTask( | 358 worker_task_runner_->PostTask( |
358 FROM_HERE, | 359 FROM_HERE, |
359 base::BindOnce(&ImageController::ProcessNextImageDecodeOnWorkerThread, | 360 base::BindOnce(&ImageController::ProcessNextImageDecodeOnWorkerThread, |
360 base::Unretained(this))); | 361 base::Unretained(this))); |
361 } | 362 } |
362 } | 363 } |
363 | 364 |
364 ImageController::ImageDecodeRequest::ImageDecodeRequest() = default; | 365 ImageController::ImageDecodeRequest::ImageDecodeRequest() = default; |
365 ImageController::ImageDecodeRequest::ImageDecodeRequest( | 366 ImageController::ImageDecodeRequest::ImageDecodeRequest( |
366 ImageDecodeRequestId id, | 367 ImageDecodeRequestId id, |
367 const DrawImage& draw_image, | 368 const DrawImage& draw_image, |
368 const ImageDecodedCallback& callback, | 369 const ImageDecodedCallback& callback, |
369 scoped_refptr<TileTask> task, | 370 scoped_refptr<TileTask> task, |
370 bool need_unref) | 371 bool need_unref, |
| 372 ImageDecodeCache::ImageDecodeType decode_type) |
371 : id(id), | 373 : id(id), |
372 draw_image(draw_image), | 374 draw_image(draw_image), |
373 callback(callback), | 375 callback(callback), |
374 task(std::move(task)), | 376 task(std::move(task)), |
375 need_unref(need_unref) {} | 377 need_unref(need_unref), |
| 378 decode_type(decode_type) {} |
376 ImageController::ImageDecodeRequest::ImageDecodeRequest( | 379 ImageController::ImageDecodeRequest::ImageDecodeRequest( |
377 ImageDecodeRequest&& other) = default; | 380 ImageDecodeRequest&& other) = default; |
378 ImageController::ImageDecodeRequest::ImageDecodeRequest( | 381 ImageController::ImageDecodeRequest::ImageDecodeRequest( |
379 const ImageDecodeRequest& other) = default; | 382 const ImageDecodeRequest& other) = default; |
380 ImageController::ImageDecodeRequest::~ImageDecodeRequest() = default; | 383 ImageController::ImageDecodeRequest::~ImageDecodeRequest() = default; |
381 | 384 |
382 ImageController::ImageDecodeRequest& ImageController::ImageDecodeRequest:: | 385 ImageController::ImageDecodeRequest& ImageController::ImageDecodeRequest:: |
383 operator=(ImageDecodeRequest&& other) = default; | 386 operator=(ImageDecodeRequest&& other) = default; |
384 ImageController::ImageDecodeRequest& ImageController::ImageDecodeRequest:: | 387 ImageController::ImageDecodeRequest& ImageController::ImageDecodeRequest:: |
385 operator=(const ImageDecodeRequest& other) = default; | 388 operator=(const ImageDecodeRequest& other) = default; |
386 | 389 |
387 } // namespace cc | 390 } // namespace cc |
OLD | NEW |