| 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 |