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

Side by Side Diff: cc/tiles/image_controller.cc

Issue 2904743002: cc: Add UMA for tracking decode duration for out of raster decodes. (Closed)
Patch Set: .. Created 3 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
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698